検索

キーワード


目次

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

  • 公開日:2021-12-05 21:23:52
  • 最終更新日:2021-12-28 22:07:29
2進数の掛け算・割り算(乗除算)の方法とシフト演算(論理シフトと算術シフト)について

Workteria(ワークテリア)では難易度の高いものから低いものまで、スキルや経験に合わせた案件を多数揃えています。会員登録は無料ですので、ぜひ会員登録してご希望の案件を探してみてください!

フリーランス/正社員のエンジニアとして活躍するには、ご自身のスキルや経験に合わせた仕事を選ぶことが大切です。ご希望の案件がみつからない場合はお気軽にお問い合わせください!ユーザ満足度の高いキャリアコンサルタントが在籍していますので、希望条件や悩み事などなんでもご相談ください。ご希望にピッタリの案件をご紹介させていただきます。

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


この記事を読むことで、

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

・論理シフト

・算術シフト


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


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

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

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




論理シフトと算術シフト

パソコンの写真


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

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

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




論理シフト

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

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




2進数の掛け算(乗算)

2進数の掛け算の画像


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

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

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

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


また、左論理シフトではあふれたビットは捨てます。

例えば、上記の例が4ビットまでを表すことができるとします。

上記の例では「1010」を2倍にしたため、5桁目に数値が入ります。

この場合、4ビットまでしか表せない、となっているため、

5桁目は

「オーバーフロー(桁あふれ)」:扱える範囲の数値の最大値を超えてしまったこと

となり、正確に数値が表せなくなってしまいます

論理左シフトのオーバーフロー画像.png

4ビットまでしか入らないところに5ビットの数値を入れようとしたため起こってしまい、正しい結果を得られません。

(コンピュータで数値を表す場合は、8ビットや16ビットなどの範囲が多いです)

表現できるビット数には注意しながら計算をするようにしましょう。



2進数の割り算(除算)

2進数の割り算の画像


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

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

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

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

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


また、あふれた数値が"1"だった場合は、割り算の余りとなります。

余り1となる画像




算術シフト

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

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"だった場合は、割り算の余りとなります。



図※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か月学んだ、駆け出しのエンジニアです。
現在は、ベンダー資格を取得するため、勉強を日課にできるよう努力中です。

編集した記事一覧

正社員/フリーランスの方でこのようなお悩みありませんか?

  • 自分に合う案件を定期的に紹介してもらいたい
  • 週2、リモートワークなど自由な働き方をしてみたい
  • 面倒な案件探し・契約周りは任せて仕事に集中したい

そのような方はぜひ、Workteriaサイトをご利用ください!

  • 定期的にご本人に合う高額案件を紹介

  • リモートワークなど自由な働き方ができる案件多数

  • 専属エージェントが契約や請求をトータルサポート

よく読まれている記事