8ビットで表される符号なし2進数x が16の倍数であるかどうかを調べる方法として、適切なものはどれか。
ア | x と2進数00001111のビットごとの論理積をとった結果が0である。 |
イ | x と2進数00001111のビットごとの論理和をとった結果が0である。 |
ウ | x と2進数11110000のビットごとの論理積をとった結果が0である。 |
エ | x と2進数11110000のビットごとの論理和をとった結果が0である。 |
答え ア
【解説】
まず、選択肢のイとエですが1と論理和して結果が0になることはありませんので、イとエが間違いであることがわかります。
10進数の16を2進数8けた(8ビット)で表すとどうなるかを考えます。
16=0001 0000b
また、16の2倍の32、3倍の48、4倍の64はそれぞれ
32=0010 0000b
48=0011 0000b
64=0100 0000b
ここで大体予想が付くと思いますが、16の倍数を2進数で表すと下位4ビットが0になっていることがわかります。
残った選択肢のアとウを16を計算して見ます。
ア 0001 0000 and 0000 1111=0000 0000
ウ 0001 0000 and 1111 0000=0001 0000
したがって答えはアになります。
ちなみに2の倍数(偶数)は最下位ビットが0ですので、調べたい整数x が偶数か奇数かを調べるときは1(0000 0001b)と論理積(and)を計算し結果が0になれば偶数、1になれば奇数です。
これを、C言語で書くと
if( ( x & 1 ) == 1)
奇数
else
偶数
になります。(こういうプログラムを書くとできるやつとおもわれるかもしれません。)
【キーワード】
・論理積
・論理和