AND・OR・XOR は、2つの値の同じ位置のビットどうしを演算します。AND は両方が1のときだけ1になるので、マスク(取り出したい位置だけ1にした値)と AND をとると、特定のビットだけを取り出せます。例の 0b10110100 AND 0x0F は下位4ビットの 0100 を取り出します。OR はビットを1にする(セットする)とき、XOR はビットを反転するときに使います。NOT は全ビットを反転します。
シフトと2のべき乗
左に k ビットシフトすると値は 2ᵏ 倍に、右に k ビットシフトすると 2ᵏ で割って切り捨てた値になります(はみ出さない範囲で)。掛け算や割り算より速いので、コンパイラは 2 のべき乗の掛け算・割り算をシフトに置き換えます。負の数を右にシフトするときは、符号ビットで埋める算術シフトを使うと、2の補数の値を 2ᵏ で割った結果(負の方向への切り捨て)になります。空いたビットを0で埋める論理シフトでは、負の数は大きな正の数になってしまいます。
ローテート(回転)
ローテートは、はみ出したビットを反対側に戻すシフトです。ビットが失われないので、暗号やハッシュ関数の計算、CRC の計算などで使われます。多くの CPU にはローテートの命令がありますが、C 言語にはローテートの演算子がないので、(x << k) | (x >> (w − k)) のように2つのシフトと OR で書き、コンパイラがローテートの命令に置き換えます。
よく使うビット演算の技
x AND 1 で奇数か偶数かが分かり、x AND (x − 1) で最も下の1のビットを消せます(これを繰り返すと1のビットの数を数えられます)。x AND (x − 1) が0なら、x は2のべき乗です。フラグ(状態を表すビット)の集まりを1つの整数で表し、OR でセット、AND と NOT でクリア、XOR で反転、AND で確認する使い方は、組込みのプログラムでレジスタを操作するときによく使われます。