ビット演算

前回に引き続き
C言語でのアルゴリズムについて

今日はビット演算子の使い方などについて写経しました。

<<ビット演算子の基本>>
ビット演算子はある値をビット単位で計算することが出来るものです。
基本的な使用方法は以下の通りです。

  
~A 補数
例)
^10111011 = 01000100

A & B AND
例)
A = 10111011
B = 00010100
A & B = 00010000

A ^ B XOR
例①)
A = 10111011
B = 00010100
A ^ B = 10101111

例②)
A = 10101111
B = 00010100
A ^ B = 10111011

A | B OR
例)
A = 10111011
B = 00010100
A | B = 10111111

特にXORでは同じ値で演算することによって、値が復元します。
この特性を利用することで、暗号化、複号化が簡単に実現できるみたいです。


<<ビットシフト演算子の基本>>
ビットシフト演算子はビットごとに値を左右に動かすことで値を変化させます。
ビットが右にずれる(シフトする)と元の値のおよそ半分になり、
ビットが左にずれる(シフトする)と元の値のおよそ倍になります。


例)
01111(15) >> 1 = 00111(7)
00111(7) << 1 = 01110(14)

例のように右にシフトするとあるはずのビットが失われてしまうため、
左にシフトした場合に元の値に戻りません。


<<ビットマスクについて>>
ビットマスクとはビット演算をする際に特定の桁数の演算処理を保障するためのものです。
具体的には「0xff(11111111)」のようなマスクを用いて、ある整数に対してANDをとることによってそのマスクが適用された桁数までを操作することを指します。


例)
int status;
int mask = 0xff; // 11111111
int a = 0x65; // 01100101
int b = 0x0a; // 00001010
int c = 0xa000; // 10100000000000000

status = a & mask;
status |= b; // 01101111

status = a & mask;
status |= c; // 01101111

例のように変数bはマスクの桁数に収まる数値のため、演算が行われましたが、
変数cのようにマスクを超える桁数の場合は値は変化しません。