1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

基本情報(シフト演算のかけ算と割り算)

Last updated at Posted at 2022-05-30

シフト演算のかけ算

シフト演算では「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 

まとめ

この辺りはひたすら計算をやれば慣れる気がするので
とにかく計算ですね。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?