ビット演算(AND, OR, XOR)
二つのビット列を入力とし、同じ位置のビットごとに論理演算を行う。
AND(論理積)
二つのビットがどちらも1なら1、どちらかでも0なら0を返す。
1010
AND 1100
= 1000
多くのプログラミング言語では&
を演算子に用いる。
and = x & y;
OR(論理和)
二つのビットがどちらかでも1なら1、どちらも0なら0を返す。
1010
OR 1100
= 1110
多くのプログラミング言語では|
を演算子に用いる。
or = x | y;
XOR(排他的論理和)
二つのビットが違う値なら1、同じ値なら0を返す(片方だけ1なら1、どちらも0またはどちらも1なら0)。
1010
XOR 1100
= 0110
多くのプログラミング言語では^
を演算子に用いる。
xor = x ^ y;
ビットシフト(シフト演算)
ビット列の各桁を右か左に移動させる。
ビットシフトもビット列に対する操作であるため、広義にはビット演算の一種とみなされる。しかしビットごとの操作ではなく数値全体に対するものであるため、ビット演算とは区別する場合もある。
左シフト
右端の空くビット位置には0が入り、あふれた左端のビットは消える。下記は4ビットレジスタの場合の例。
1111 LEFT-SHIFT 1
= 1110
多くのプログラミング言語では<<
を演算子に用いる。
leftShift = x << 1;
右シフト
算術シフト(符号あり)と論理シフト(符号なし)がある。本ツールは後者の論理シフトのみ対応している。どちらもあふれた右端のビットは消えるが、左端の空くビット位置の埋め方が異なる。
算術シフトは符号を保持するため、左端の空くビット位置には最上位ビット(符号ビット)と同じ値が入る。下記は4ビットレジスタの場合の例。
1011 RIGHT-SHIFT 1
= 1101
0011 RIGHT-SHIFT 1
= 0001
論理シフトは単純にすべてのビットをシフトするので、左端の空くビット位置には0が入る。下記は4ビットレジスタの場合の例。
1011 RIGHT-SHIFT 1
= 0101
多くのプログラミング言語では>>
または>>>
を演算子に用いる。下記はJavascriptの場合の例。
rightShift = x >> 1; // 算術シフト
rightShift = x >>> 1; // 論理シフト