偶数奇数を判定するための途方もないプログラミングコードが話題に
http://blog.livedoor.jp/itsoku/archives/55507489.html
x mod 2
で行いますが、ビット演算を使い、最下位ビットが立ってるかチェックする
x and 1
負の表現に2の補数を使うプログラミング言語では問題無いのですが、Cではちょっと問題が起きます。
X3010:2003 プログラミング言語 C 6.2.6.2 整数型
符号付き整数型において、オブジェクト表現のビットは、値ビット、詰め物ビット、および符号ビットの三つのグループにわけられなければならない。
詰め物ビットは存在しなくてもよく、符号ビットは丁度一つでなければならない。それぞれの値ビットは、対応する符号なし整数型のオブジェクト表現における同じビットと同じ値をもたなければならない。(略)
符号ビットが0であれば、それは結果の値に影響を及ぼしてはならない。符号ビットが1であれば、値は次に示す方法の一つにしたがって変更されなければならない。
- 符号ビットが0のときの値を負数化した値[符号と絶対値(sign and magnitude)]
- 符号ビットが値-(2N)をもつとするときの値[2の補数(two's complement)]
2の補数の場合(1111 1111)2
1の補数の場合(1111 1110)2
よって、処理系が2の補数を採用している場合では問題ありませんが、1の補数を採用している場合に判定が逆になります。
UNISYS社のClearPath Dorado Systems(ClearPath OS2200)で採用されているという話です。
だからCの移植性なんて、あってないものだよね。 移植性が欲しいならJavaとか.NETを使うべきだろうね。
でもCの移植するのなんか組み込みとかドライバとかの案件ばかりでC#もJavaも使えんやろ
確かにそうだね。 ドライバ開発ってこんな細かい知識がないといけないなんて大変だな・・・。 僕の仕事は高レベルの開発でいいや。