ビット演算とは
ビット演算(ビットえんざん)とは、ひとつあるいはふたつのビットパターンまたは二進数を個々のビットの列として操作することである。
数値を2進数の形式で表示し、各ビットにたいして演算を行う。
演算子 AND(&)
左辺と右辺の同じ位置のビットを比較して、共に「1」の箇所のみ位置にする。
例)
22 & 14
===> 6
これは、22が10110
で、14が1110
で共に位置の箇所を取ると、110
すなわち6となる。
演算子 OR(|)
ANDのORバージョン。そのままの意味である。
シフト演算子 << >>
シフト演算子がわかりやすいです。
x << y
は xのビットをyビットだけ左にシフトさせ、右端には0を埋める。
x >> y
は xのビットをyビットだけ右にシフトさせ、左端にはその時の最上位と同じ符号を埋める。
x >>> y
は xのビットをyビットだけ右にシフトさせ、左端には0を埋める。
最上位の桁とは、+/-を決めている桁。
例)
1 << 4 // => 2進数で10000なので、16を返す
3 << 5 // => 2進数で1100000なので、96を返す
8 >> 2 // => 2進数で10なので、2を返す。
<<
は左オペランドのビットを右オペランドのビット分だけ、左にシフトさせます。左へのシフトは元の値に2をシフト分累乗した値を乗算することを意味します。
>>
は左オペランドのビットを右オペランドのビット分だけ、右にシフトさせます。右へのシフトは元の値に2をシフト分累乗した値を除算することを意味します。左端には最上位のビットと同じ符号が入ります。
>>>
は左オペランドのビットを右オペランドのビット分だけ、右にシフトさせます。左端には0が入ります。左端に0が入ると言うことは >>>は演算結果に正負の区別を持たないとも言えます。>>>演算子は符号の区別を持たない演算処理に使用します。
ビットベクトルとは
[1,0,0,0,0,1]
のように0,1のみを値として持つベクトルのことである。
4バイトの領域があれば、32個の0と1の並びを表現できる。
例えば、Javaにおけるint
タイプは 4 bytes(32 bits) である。つまり、int
型の変数一つで32個の0と1の並びを表現することができる。
ビットを立てる
int position = 5 // 0101 の1の箇所を指す
int foo = 0;
foo = foo | 1 << position // posの場所のbitを1に立てる
foo |= 1 << position
ともかける。
参考
Javaのそれぞれの数字型のbit数に関して
Section 4.2: Primitive Types and Valuesより
The integral types are byte, short, int, and long, whose values are 8-bit, 16-bit, 32-bit and 64-bit signed two's-complement integers, respectively, and char, whose values are 16-bit unsigned integers representing UTF-16 code units (§3.1).