シフト演算のかけ算
シフト演算では「2,4,8,16」のような2nに当たる数字でしか、掛け算と割り算もできません。
「3」や「7」などの半端な数字で行う計算をどうすればよいか考えるのですが下記のようにできます。
例えば変数Nを7倍にする時は7を2進数に分解します。
N * 7 = N * (4 + 2 + 1)
= N * (2²+2¹+2⁰)
= (N * 2²)+(N * 2¹)+(N * 2⁰)
2²は左に2ビットシフト
2¹は左に1ビットシフト
2⁰は元の数値
では変数Nを5と仮定します。
5を2進数にまず変換します。
128 64 32 16 8 4 2 1
0 0 0 0 0 1 0 1
8ビットなので8桁までだします。
5 * 7 = (00000101 * 2²)+(00000101 * 2¹)+(00000101 * 2⁰)
= 00010100 + 00001010 + 00000101
= 00100011
2進数を10進数に戻します
128 64 32 16 8 4 2 1
0 0 1 0 0 0 1 1
10進数だと35ですね!
かけ算ができました。
シフト演算のわり算
まず「わり算とは何か」を整理すると
20 / 5 は5ずつ4つに分けられるの意味となります。
つまり20という数字からは5を4回、引くことができるとなるわけです。
15 / 3 をやってみます
128 64 32 16 8 4 2 1
0 0 0 0 1 1 1 1 // 15
0 0 0 0 0 0 1 1 // 3
1111から11は何回引けるかというと
11を2ビットシフト
1111
-1100
------
11
11を0ビットシフト
11
-11
----
0
重み 2⁷ 2⁶ 2⁵ 2⁴ 2³2²2¹2⁰
重み 128 64 32 16 8 4 2 1
2ビットシフトは4で0ビットシフトは1です。
2² + 2⁰ = 4 + 1
= 5
上記のやり方は普通に割り算するやり方と変わりません
101 // 10進数だと5
----
11|1111
11
-------
11
0
-------
11
11
-------
0
まとめ
この辺りはひたすら計算をやれば慣れる気がするので
とにかく計算ですね。