ビット演算>左シフト

左シフトとは、下図のように、各ビットをひとつ左にずらし、最下位ビットに0を入れることだ。最上位ビットの値は捨てられる(最上位ビット1で、それが捨てられることを「ビット溢れ」と呼ぶ)。

shift-left

C/C++ では 二項演算子 << が左ビットシフトを表す。
シフトするビット数は1だけとは限らず、「x << 2」 の様にシフトするビット数を付加して記述することが出来る。

int x = 0xff << 4;  // 0xff を4ビットシフトした値を x に代入
x <<= 2;  //  x を 2ビット左シフトし、それを x に代入

上記は C/C++ での左シフトの使用例だ。

2進数の各ビットの値を b[i] とすると、値は Σ (b[i] * 2^i) である。
1ビット左シフトするということは b[i+1] = b[i] を実行することなので、ビット溢れがなければ、シフト後の値は Σ (b[i] * 2^(i+1)) = Σ (b[i] * 2^i)*2) = 2 * Σ (b[i] * 2^i) となる。

つまり、ビット溢れが無い場合は、1ビット左シフトするということは値を2倍することを意味する。
2ビット左シフトなら4倍、3ビット左シフトなら8倍、4ビット左シフトなら16倍・・・ というわけだ。

このことがよく理解出来ない人は、10進数を考えるといいかもしれない。
例えば「123」を一桁左シフトすると「1230」となる。もとの値の10倍だ。これは10進数だからである。
2進数なら1ビット左シフトは2倍、N進数なら1桁左シフトはN倍ということだ。

演習問題:

  1. int x = 100; を宣言し、x を1ビット左シフトした値を表示し、値が2倍になっていることを確認しなさい
  2. char c = 5; を宣言し、c <<= 6 を実行すると、c の値はいくつになるかを事前に予想してから、結果を確かめなさい。
  3. int x; に何か数値が入っているとき、掛け算を使わず、左シフトを使って x を10倍にするコードを書きなさい。

 演習問題解答例