ビット演算とビットシフトは、2進数を高速に操作する強力なテクニック。プログラミング・OS・組込みで頻繁に登場します。
ビット演算って論理演算と違うの?
基本は同じよ。
ビット演算は、論理演算をビット (各桁) 単位で行うことを指すの。
あとはシフト演算という独自の操作もあるわ。
シフトって、横にずらすってことですかぁ?
その通り。
例えば 0000 1100 (10進数で12) を左シフト 1ビットすると 0001 1000 になって、10進数では 24 ね。
おぉ、2倍になった!
じゃあ右シフトすると半分?
あたし、これめっちゃ便利じゃん!
そうなの。
右シフト 1ビットで 1/2 (整数除算) になるわ。
シフト演算は乗除算より高速だから、最適化テクニックとして昔から使われているの。
へぇ〜!
掛け算や割り算より速いんですねぇ。
シフトには2種類あって、論理シフトと算術シフトがあるのよ。
論理シフトは空いた桁に0を入れるの。
算術シフト (右の場合) は、符号を維持するために最上位ビットを伸ばすのよ。
符号付き整数を扱うときは算術シフトを使うのが基本ね。
-8 を 2 で割ると -4 になるべきだけど、論理シフトだと全然違う値になっちゃうの。
なるほど…細かいけど大事なんだね。
あたし、しっかり覚える!
あとはビットマスクという超重要テクニック。
AND演算で特定のビットだけ取り出せるの。
例えば 0xFF とANDをとると下位8ビットだけ取り出せる。
これでフラグ管理やパディング処理ができるわ。
便利すぎですぅ!
えへへ♪
確認クイズ
8ビット符号なし整数の値 12 (00001100) を2ビット左シフトした結果は何か。
- 3
- 6
- 24
- 48
こたえを見る
正解: 4. 48
12 を2ビット左シフトすると 00110000 になり、これは 32 + 16 = 48 です。左シフトnビット = ×2^n の関係から、12 × 2² = 48 と計算してもよいです。