Edited at

「ビット演算・ビットベクトルとは」を理解する

More than 3 years have passed since last update.


ビット演算とは

ビット演算 wikipediaより


ビット演算(ビットえんざん)とは、ひとつあるいはふたつのビットパターンまたは二進数を個々のビットの列として操作することである。


数値を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).