ぜったいわかる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:現役バリバリなのに、若い技術者が不足しまくっているのは何故だろう?