ビット演算とシフト

2進数を高速操作するビット演算とシフト演算を学びます。

ビット演算とビットシフトは、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ビット左シフトした結果は何か。

  1. 3
  2. 6
  3. 24
  4. 48
こたえを見る

正解: 4. 48

12 を2ビット左シフトすると 00110000 になり、これは 32 + 16 = 48 です。左シフトnビット = ×2^n の関係から、12 × 2² = 48 と計算してもよいです。

🔖 この記事の関連書籍

Amazonアソシエイトリンクを含みます。他分野は おすすめ書籍ページ へ。