単一の整数値、または2つの整数値同士は、ビット演算子を使ってビット演算が可能である・・・。
まずは、入力されたa, bの値を2進数のビット列で出力する・・・。
2で割った余りを下の桁から文字配列に入れていく感じ・・・。
(今回はintのa, bを8桁2進数で表すようにしてしまったが、本来はunsigned intを32桁2進数で表すべきだった・・・。反省・・・。)
$ gcc bit_operator.c -o bit_operator $ ./bit_operator a: 3 b: 23 a(2) = 00000011 b(2) = 00010111
a( = 3)とb( = 23)を2進数で表すとこうなる・・・。
aとbのビット演算ORは、
a | b
と書く・・・。
aとbのビット演算ORの結果をxに代入し、2進数で表すと、
$ ./bit_operator a: 7 b: 32 a(2) = 00000111 b(2) = 00100000 x(2) = 00100111
7と32ならこうなる・・・。
aとbのどちらかでビットが立っていれば、xにもビットが立つ・・・。
aとbのビット演算ANDは、
a & b
と書く・・・。
aとbのビット演算ANDの結果をyに代入し、2進数で表すと、
a: 7 b: 34 a(2) = 00000111 b(2) = 00100010
.
.
.
y(2) = 00000010
7と34ならこうなる・・・。
aとbの両方でビットが立っていれば、yにもビットが立つ・・・。
xのビット演算NOTは、
~x
と書く・・・。
xのビット演算NOTの結果はunsigned int型nxに代入し、2進数で出力する・・・。
(NOTの場合は数字が大きくなり、ビット列における1が多くなるので、unsigned intにして表示する文字配列も32文字に対応している・・・。)
xが23(00010111)の場合、
x(2) = 00010111
.
.
.
nx(2) = 11111111111111111111111111101000
0と1が反転している・・・。
aとbのビット演算XORは、
a ^ b
と書く・・・。
a( = 3)とb( = 23)のビット演算XORの結果をxabに代入し、2進数で表すと、
a(2) = 00000011 b(2) = 00010111
.
.
.
xab(2) = 00010100
こうなる・・・。
xのビット演算RSHIFT(右シフト)は、
x >> <シフト数>
と書く・・・。
今回はxを2つ右シフトする・・・。
xの2つ右シフトした結果を、rxに代入し、2進数で表すと、
x(2) = 00010111
.
.
.
rx(2) = 00000101
こうなる・・・。
xのビット演算LSHIFT(左シフト)は、
x << <シフト数>
と書く・・・。
xを2つ左シフトの場合は、
xの2つ左シフトした結果を、lxに代入し、2進数で表すと、
x(2) = 00010111
.
.
.
lx(2) = 01011100
こうなる・・・。
Sample/bit_operator.c at master · bg1bgst333/Sample · GitHub