検索

キーワード


2進数の掛け算・割り算(乗除算)の方法とシフト演算(論理シフトと算術シフト)について

  • 公開日:2021-03-29 17:32:09
  • 最終更新日:2021-05-10 19:12:47
2進数の掛け算・割り算(乗除算)の方法とシフト演算(論理シフトと算術シフト)について

10進数で掛け算・割り算ができるように、他の基数での掛け算・割り算も可能です。


この記事を読むことで、

・2進数の掛け算・割り算(乗除算)

・論理シフト

・算術シフト


以上のことが分かります。


また、基数・進数・桁の重みについてより詳しく知りたい方は、

基数とは?IT系国家試験の基本知識、2進数について解説!

をご一読ください。基数についてより知ることができます!




論理シフトと算術シフト

パソコンの写真


2進数の掛け算と割り算は、ビットを右や左にずらして行います。

このビットをずらす(シフトする)操作を「シフト演算」と呼びます。

また、このシフト演算には「論理シフト」と「算術シフト」という2つの手法があります。




論理シフト

論理シフトとは、符号を考慮せずにシフトを操作することをいいます。

つまり、先頭ビットも数値として考えてシフトをする、ということです。




2進数の掛け算(乗算)

2進数の掛け算の画像


元の数値を左にシフトすることで、掛け算(2のn乗)ができます

空いた桁には“0”を入れます。

2進数「1010」(10進数「10」)を左に1シフトすることで、

2進数「10100」(10進数「20」)になり2倍にできました。




2進数の割り算(除算)

2進数の割り算の画像


元の数値を右にシフトすることで、割り算( 1/2のn乗)ができます

“0”があふれた場合は、消します。

2進数「1010」(10進数「10」)を右に1シフトすることで、

2進数「101」(10進数「5」)になり1/2倍(半分)にできました。


論理シフトでは、符号を考慮せずに計算するため、上記の例のように4桁すべてをシフトして、倍や1/2にすることができました。




算術シフト

算術シフトは、論理シフトに符号(+,-)が付いたものになります。

2進数では、先頭ビットが符号になります。

つまり、先頭ビットは固定して、それ以下の数値のみをシフトをする、ということです。

※2進数の先頭ビットを符号とする場合、0→正・1→負とします。


2進数の符号については、

2進数の足し算・引き算(加減算)の方法と正の数・負の数、補数について解説! 負の数(-:マイナス)の表し方

に詳しく解説してあります。




2進数の掛け算(乗算)

2進数の掛け算(算術シフト)の画像


論理シフトと同じく、元の数値を左にシフトすることで、掛け算(2のn乗)ができます。

先頭ビット(4桁目)は符号として扱うため、固定です。

左にシフトし、空いた1桁目には“0”を入れます。


2進数「1110」(10進数「-2」)を左に1シフトすることで、

2進数「1100」(10進数「-4」)になり2倍にできました。


負の数は元の数値を反転させ、+1させます。

負の数の表し方の画像





2進数の割り算(除算)

2進数の割り算(算術シフト)の画像


元の数値を右にシフトすることで、割り算( 1/2のn乗)ができます。

“0”があふれた場合は、消します。


2進数「1110」(10進数「-2」)を右に1シフトすることで、

2進数「1111」(10進数「-1」)になり1/2倍(半分)にできました。


図※1

右に算術シフト(算術シフトの割り算)をした場合、空いた桁に入れる数値は先頭ビットによって変わります。

先頭ビットが0の場合の画像


先頭ビットが1の場合の画像


算術シフトの割り算(右シフト)の場合は、空いた桁に入れる数値には注意が必要です!




シフト演算以外の掛け算・割り算

数学の画像

上記までは、右シフトや左シフトをすることで掛け算・割り算の方法を紹介しました。

しかし、シフト演算では

右シフト(掛け算)することで「2・4・8…倍」

左シフト(割り算)することで「1/2・1/4・1/8…倍」

と倍々の計算しかできません。

例えば「3倍」や「5倍」などシフト演算ではできない計算はどうすればよいのでしょうか?

答えは、

掛け算をしたい場合「倍にしたい数値を2の n乗に置き換え、足し算をする」

割り算をしたい場合「元の数値から割りたい数値が2の n乗回、引けるかを計算する」

です。




掛け算

元の数値を5倍にする例(算術シフト)で解説します。


5倍の掛け算



2進数「11111110」(10進数「-2」)が5倍の

2進数「11110110」(10進数「-10」)になりました。


掛け算をしたい場合

「倍にしたい数値を2の n乗に置き換え、足し算をする」

 倍にしたい数値  →5

 2の n乗に置き換え→2²と2⁰(4と1)

 足し算をする   →( a × 2²)+( b × 2⁰)

ということです。




割り算

今度は、元の数値を1/5倍にする例(論理シフト)で解説します。


5の割り算画像


2進数「110」は10進数「6」です。

2進数「00011110」(10進数「30」)が1/5倍(÷5)の

2進数「110」(10進数「6」)になりました。

いくつ左にシフトしたかを考えていくと

2²(2ビットシフト)+2¹(1ビットシフト)

=4+2

=6(0110)

元の数値から引くことができた回数は、いくつ2の n乗シフトしたかを足すことで分かります。


また、10進数で考えると、

① 30-5=25

② 25-5=20

③ 20-5=15

④ 15-5=10

⑤ 10-5=5

⑥ 5-5=0												

30は5を6回引くことができる、ということです。


このことからも、割り算は引き算で元の数値から何回引けるか、で答えが分かるということです。


割り算をしたい場合

「元の数値から割りたい数値が2の n乗回、引けるかを計算する」		

 元の数値   →30

 割りたい数値 →5

 2の n乗回  →2²+2¹

 引けるかを計算→2²+2¹=6

ということです。




まとめ

2進数の掛け算・割り算について、シフト演算での方法が分かったでしょうか?


左シフトで掛け算、右シフトで割り算ができます。

また、空いた桁のスペースには“0”を

算術シフトの右シフトの場合にのみ、符号が“1”であれば空いた桁に“1”を入れます。

これは、忘れやすいので注意しましょう。





【著者】

伊藤

Javaを研修で3か月学んだ、駆け出しのエンジニアです。
現在は、ベンダー資格を取得するため、勉強を日課にできるよう努力中です。

よく読まれている記事