ビット演算とは?仕組みとビット幅をわかりやすく解説
この記事の要点
- ビット演算は、整数を0と1の列として桁ごとに操作する計算です。
- AND・OR・XOR・NOTは抽出、設定、切り替え、反転に使えます。
- NOTやシフト、負数を扱うときはビット幅と符号の解釈が重要です。
ビット演算とは何か
ビット演算とは、整数を2進数のビット列として見て、同じ位置にあるビット同士を直接操作する計算です。通常の足し算や掛け算が数値全体を対象にするのに対し、ビット演算は1桁ずつ0または1を判定します。
たとえば10進数の12は、8ビットの2進数では00001100です。各桁にANDやORを適用すると、必要な部分だけを残したり、指定した桁を1にしたりできます。
2進数とビットの関係
1ビットは0または1のどちらかを表します。右端から順に1、2、4、8、16…の重みを持ち、1になっている桁の値を足すと10進数になります。
16進数は4ビットを1桁で表せるため、長いビット列を短く書くときに便利です。00001100は16進数で0Cになります。
代表的なビット演算
両方が1の桁だけを1にします。マスクした範囲の抽出やフラグ判定に使います。
どちらかが1なら1にします。特定のフラグを立てる操作に使います。
2つのビットが異なるときだけ1にします。差分検出やフラグの切り替えに使います。
0を1、1を0に反転します。結果は指定したビット幅によって変わります。
ビット列を左右へ移動します。2の累乗による乗除算やフィールド位置の調整に使います。
端から出たビットを反対側へ戻します。暗号やハッシュなどの処理で使われます。
ビット幅が重要な理由
ビット幅は、値を何桁の2進数として扱うかを決めます。8ビットなら00000000から11111111までです。幅を超えた上位ビットは切り捨てられます。
同じ15をNOTしても、8ビットでは240、16ビットでは65520になります。ツールやプログラムで結果を比較するときは、演算前にビット幅をそろえてください。
SignedとUnsignedの違い
Unsigned(符号なし)は全ビットを値として使います。8ビットなら0〜255です。Signed(符号付き)は通常、最上位ビットを含む2の補数表現で負数を表し、8ビットなら−128〜127になります。
ビット列11111111は、Unsignedでは255、Signedでは−1です。ビット列そのものは同じでも、読み方によって10進数の意味が変わります。
ビット演算が使われる場面
- フラグ管理:複数のON/OFF状態を1つの整数にまとめる。
- 権限判定:読み取り・書き込み・実行などの許可をビットで管理する。
- 色データ:RGBやRGBAから特定の成分を抽出する。
- 通信・ファイル形式:ヘッダー内のフラグやフィールドを読み書きする。
- 組み込み開発:ハードウェアレジスタの特定ビットを操作する。