ぜったいわかる2の補数

2の補数を覚えているか?

情報処理試験を受けたことのある人は、きっと
「2の補数」って勉強したことがあると思う。


そう、「ビットを反転して1を足す」っていうアレだ。


しかし、人の話を聞くと、受験が終わるとさっぱり忘れてしまいがちのようである。

2の補数は現役バリバリ

世の中には、COBOLは現役バリバリなどということを主張する人もいるが*1
2の補数はガチで現役バリバリである。


なので、いちおう基本は覚えておいたほうが良いと思う。
ダンプイメージしか見れないこともあるかもしれないし。

ビットを反転して1を足す??

まず、この覚え方がいけない。意味が分からないからだ。
「1を足してビットを足す」というふうに間違って覚えるかもしれないし、
「ビットを反転して1を引く」というふうに間違えるかもしれない。


人間意味の分からないことを覚えるのは苦手なので、
変わりに、とりあえずこのふたつを覚えて欲しい。

  • オール1だったら-1
  • 1番左のビットだけ1だったら最小値


最低、上の1こだけでも覚えていればOKだ。

確かめてみよう

以下の例を見て、ほんとうにそうなっているか、ぜひ確かめて欲しい。

1ビット
2進数 10進数 補足
0 0
1 -1 オール1だったら-1,1番左のビットだけ1だったら最小値
2ビット
2進数 10進数 補足
01 1
00 0
11 -1 オール1だったら-1
10 -2 1番左のビットだけ1だったら最小値
3ビット
2進数 10進数 補足
011 3
010 2
001 1
000 0
111 -1 オール1だったら-1
110 -2
101 -3
100 -4 1番左のビットだけ1だったら最小値
4ビット
2進数 10進数 補足
0111 7
0110 6
0101 5
0100 4
0011 3
0010 2
0001 1
0000 0
1111 -1 オール1だったら-1
1110 -2
1101 -3
1100 -4
1011 -5
1010 -6
1001 -7
1000 -8 1番左のビットだけ1だったら最小値

以下何ビットになってもおなじかんじである。

結局は、「ビットを反転して1を足す」

最終的に、そのビット列が10進数で何を示すかを求めるには、
「ビットを反転して1を足す」という操作をしないといけないんだが、
上記の考え方を覚えていれば、「ビットを反転して1を足す」というのが
うろ覚えでも、すぐに導き出せるはずだ。


逆に「ビットを反転して1を足す」とだけ覚えていると、
計算した結果が本当に正しいかどうか自信がもてないだろう。

おまけ

で、2の補数ってなにがうれしいか復習しておこう。

  • 1の補数だと、正の0と負の0二種類できる
  • 足し算で引き算できる。

2こめがわかりにくいので、例を挙げる。
例えば、4 - 2 = 2という計算をする場合、
4 + (-2) = 2という風に計算できる。
つまり、

  0100
 +1110
 -----
  0010

こんなかんじ。

まとめ

2の補数、オール1なら-1

*1:現役バリバリなのに、若い技術者が不足しまくっているのは何故だろう?