0
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.

基本情報(2進数の足し算と引き算)

Last updated at Posted at 2022-05-26

コンピュータには「引き算」という概念ありませんというパワーワードを見ました。
だけど引き算はできる。さて、どうやるのか。

一旦、足し算からおさらいします。

 1111
+ 101
------
10100
// 1 + 1 = 0(繰上げ1)

5-3を計算させたい場合は5+(-3)の計算ができれば、足し算と使って引き算と同じ結果を
得ることができるようです。

負の数の表し方

引き算を知らなくても、負の数を表現できれば足し算で答えを求められます。

条件

  • 数値を8ビットで表すことにする(8ビットは2進数で8桁)
  • 先頭の1ビットが0なら正の数、1なら負の数とする

例えば10進数の「3」を

正の数 0 0 0 0 0 0 1 1 ( 3)
負の数 1 0 0 0 0 0 1 1 (-3)

00000011 + 10000011 = 100000110
3と-3を足したら0にならないといけないのに上記はそうなっていません。

そこで補数という概念が出るそうです。

補数は言葉の通り「補う数」という意味。

例えば10進数で123という数字があったとします。

999 - 123  = 876  // 9の補数と呼ぶ
1000 - 123 = 877 // 10の補数と呼ぶ

999は3桁の最大値で、1000は次の桁に繰り上がる数です。

2進数では「1の補数」と「2の補数」の2つの補数があります。

例えば2進数で0011という数字があったとすると

1111 - 0011  = 1100  // 1の補数
10000 - 0011 = 1101  // 2の補数

4桁の最大値は1111で次の桁に上がる数は10000です。

2の補数を使って計算をしてみます。

  00000011
+ 11111101
-----------
 100000000

8ビットから溢れた9ビット目を無視すると00000000になる。
つまり0になります。

ある数値に対する2の補数表現は、負の値として使えます。
このことから、コンピュータは負の数を表すのに2の歩数を使うようです。

2の補数は次のように求めることができます

00000011 ( 3)
11111100 // 全てのビットを反転させる(0と1を入れ替える)
11111101 (-3) // それに1を加算する

引き算の流れ

5-3を2進数に変換して計算します。

0101 - 0011
     + (-0011)
     + 1101

0101 + 1101 = 0010(桁溢れした先頭のビットは切り捨て)

まとめ

この章はちょっと、しっくりこなかったので復習しようと思います。

0
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
0
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?