ビット演算とシフトの求め方

2 つの整数を 2 進法に直し、桁ごとに AND・OR・XOR をとります。あわせて a をシフト量だけ左右にずらした値も出します。左へ 1 つずらすと 2 倍、右へ 1 つずらすと半分(切り捨て)になります。

コンピュータは数を 2 進法で持っています。0 と 1 だけを使い、桁が 1 つ上がるごとに 2 倍になる書き方です。ビット演算は、その 2 進法の桁を 1 つずつ見比べて計算するやり方です。ふつうの足し算や掛け算とは違って、桁から桁へ繰り上がることはありません。それぞれの桁が独立して決まります。

3 つの演算

既定の入力 a = 12、b = 10 で見てみます。2 進法に直すと、12 は 1100、10 は 1010 です。

XOR は排他的論理和とも呼びます。同じ数字どうしなら 0、違えば 1 と覚えると楽です。同じ数で 2 回 XOR をとると元の数に戻る、という性質があります。

シフト

シフトは、2 進法の桁をまるごと横へずらす操作です。10 進法で 12 を左へ 1 桁ずらすと 120 になって 10 倍になりますが、それと同じ理屈で、2 進法では 2 倍になります。

12 は 1100 です。左へ 2 つずらすと 110000 になり、10 進法では 48 です。12×22=4812 \times 2^2 = 48 と一致します。右へ 2 つずらすと 11 になり、10 進法では 3 です。12÷22=312 \div 2^2 = 3 です。

右シフトでは、はみ出した桁は捨てられます。13 は 1101 で、右へ 1 つずらすと 110、つまり 6 です。6.5 にはならず、小数点以下は切り捨てになります。

使いどころ

よく使われるのは、いくつもの「はい・いいえ」を 1 つの数にまとめて持つ場面です。1 つの桁を 1 つの設定に割り当てておけば、AND で特定の設定が入っているかを調べられますし、OR で設定を足し、XOR で入り切りを反転できます。2 のべき乗の掛け算や割り算を、シフトで手早く済ませることもあります。

気をつけること

この計算機が受け取れるのは 0 以上 2147483647 以下の整数です。2147483647 は 2 を 31 回掛けた数から 1 を引いたもので、多くのプログラミング言語でビット演算の扱える上限になっています。また、左へずらした結果が大きくなりすぎて正確に表せない場合は、誤った数を出さずに計算できないことを知らせます。