なんで記事に?
思い付いたのですが、調べても案外出ませんでした。
出てくるのは奇遇判定ばかり…。
折角なので書こうと思います。絶対使うことないけど。
※以下のコードはすべて動作確認をしていないので、使用する際はご注意ください。まあ使うことないと思うけど。
いきなりコードかい!
C++ / 記事タイ通りです
// 整数値を偶数にする。
int toEven(
int a_num,
bool a_toZero = false
) {
// 絶対値を取得。
int absNum = abs( a_num );
// 奇数なら偶数にし、さらに入力値がマイナスならマイナスにした値を返す。
return ( absNum
+ (a_toZero * -2 + 1 * (absNum % 2)) )
* ((a_num != absNum) * -2 + 1);
}
初心者向け
タグを付けたのに競技プログラミングみたいじゃないかい! と思いましたよね?
失礼いたしました…。 一応、速度が出るように、分岐を無くしたからです。速いかどうかは知らん(多分コンパイラに任せるべき)。
てなわけで砕いた奴
可読性はこっちの方が圧倒的に高いですよね。
int toEven(
int a_num,
bool a_toZero = false
) {
// 絶対値を取得。
int absNum = abs( a_num ); // 入力値の絶対値
int res = absNum; // 戻り値
// 奇数なら偶数にする。
if (1 == absNum % 2) {
// ゼロ側に丸めるなら、1を引いて偶数に。
if (a_toZero) {
res -= 1;
}
// 1を足して偶数に。
else {
res += 1;
}
} // if (1 == absNum % 2)
// 入力値がマイナスだったのなら、
// 出力値もマイナスにする。
if ( a_num < 0 ) {
res *= -1;
}
// 値を返す。
return res;
}
やっていることは簡単で、
-
absNum % 2
で奇遇判定をする - 奇数なら、
1
足すか引いて偶数にする
だけです。
冒頭に書いた「調べて出てくる」ものは、このリストの1番目です。
そこに、日常で数合わせ等の為に行っている、偶数にする操作を加えただけです。
一応関数の説明
XAML でも JavaDoc でもない形式なのでご注意を。
// summary: 整数値を偶数にする。
// param a_num : もとの整数。
// param a_toZero: 0 に近い数にするか。
// true なら 0 に近いほうの偶数にし、
// false なら 0 から遠いほうの偶数にする。
// return: 整数の偶数値を返す。
最後に
もし何かに使う機会があったり、同じ処理をするコードを使ったことがある人は、良ければコメントに書いていってください。
この筆者は、どうやら絶対に使わないと思っているようなので、教えてあげてください。
ま、一応画像サイズは偶数が好ましいことが多いので、そこで使ったりしますけどね。