【基礎からわかる】1の補数・2の補数とは?計算方法と役割を解説
補数とは?
補数(complement) とは、ある数を特定の基準値まで補う(足して満たす)ための数のことです。2進数の世界では「あるビット数(桁数)のうち、すべてが1になった値を基準」にして考えられます。
コンピュータで負の数を表現するときや、演算の簡略化を行うときに登場するのが「1の補数」「2の補数」です。
1の補数(One’s Complement)
1. 定義と求め方
-
定義
ある2進数の すべてのビットを反転(0↔1) したものを「1の補数」と呼びます。 -
求め方
- ビット列の 0 を 1 に、1 を 0 に変えるだけ
例)3ビットで 001 の 1の補数 → 110
- ビット列の 0 を 1 に、1 を 0 に変えるだけ
2. 1の補数が果たす役割
(1) 1の補数と最大値の関係
nビットで表現できる最大値は「ビットがすべて 1」の状態、すなわち 2^n - 1 です。
ある数とその 1の補数を足し合わせると、この「全ビット1」になる関係があります。
- 例:3ビットで 001 (2進数) の場合
- 1の補数は 110
- 001 + 110 = 111 (繰り上がったビットは捨てる想定) → 111 は 2進数で 7、つまり 2^3 - 1
(2) かつては負の数の表現に使われた
かつてはコンピュータが負数を表す方法として 1の補数方式 が使われたこともあります。しかし、
- +0 と -0 の二種類の 0 が生まれてしまう
- 現在はより使いやすい 2の補数方式 に主流が移った
といった理由から、実際のコンピュータでの利用頻度は減っています。
2の補数(Two’s Complement)
1. 定義と求め方
-
定義
ある2進数の 1の補数に 1 を加えたもの が「2の補数」です。 -
求め方
- 元のビットをすべて反転する(1の補数をとる)
- さらに “1” を足す
例)3ビットで 001 (2進数) の場合
- 001 → ビット反転 → 110 (1の補数)
- 110 + 1 → 111 (2の補数)
2. なぜ使われるのか?
(1) 負の数の表現に便利
2の補数方式では、ビットの最上位ビットが 1 のとき 負の数 を示す、というルールで運用されることが多いです。
たとえば 3ビットで次のように解釈します:
2進数 | 10進数 (2の補数方式での解釈) |
---|---|
000 | +0 |
001 | +1 |
010 | +2 |
011 | +3 |
100 | -4 |
101 | -3 |
110 | -2 |
111 | -1 |
(2) 加減算が容易
2の補数を使うと、負の数を含む加減算 が通常の2進数の加算器で簡単に行えます。
負数を別に処理する必要がなく、コンピュータの回路設計がシンプルになることから、現在は 2の補数方式が標準的 に使われています。
まとめ
-
1の補数
- ビットを反転したもの。
- 元の数と足すとビット幅いっぱいの “111...1” になる。
- +0 と -0 が生じる問題などから、実装で使われることは少ない。
-
2の補数
- 1の補数に 1 を足したもの。
- 容易に負の数を表現・演算できるため、現代のコンピュータでは標準的な方式。
練習問題
以下の問題を解いて、1の補数・2の補数への理解を深めてみましょう。
問題1:1の補数の計算
(1) 3ビット で考えたとき、それぞれの 1の補数 を求めなさい。
- a. 000
- b. 101
- c. 011
(2) 4ビット で考えたとき、それぞれの 1の補数 を求めなさい。
- a. 0000
- b. 1001
- c. 0110
問題2:2の補数の計算
(1) 3ビット で考えたとき、それぞれの 2の補数 を求めなさい。
- a. 000
- b. 101
- c. 011
(2) 4ビット で考えたとき、それぞれの 2の補数 を求めなさい。
- a. 0000
- b. 1001
- c. 0110
問題3:負数の解釈(2の補数方式)
以下は4ビットで表された数です。2の補数方式において、それぞれの 10進数での値は何になるでしょうか?
- a. 1111
- b. 1000
- c. 1010
- d. 0101
練習問題 解答例
※ 以下は解答例です。解法の流れや考え方をぜひチェックしてみてください。
問題1:1の補数
(1) 3ビットの場合
- a. 000 → 111
- b. 101 → 010
- c. 011 → 100
(2) 4ビットの場合
- a. 0000 → 1111
- b. 1001 → 0110
- c. 0110 → 1001
問題2:2の補数
(1) 3ビットの場合
- a. 000
- 1の補数:111、+1 すると 1000 だが 3ビットに収まらないため先頭ビットが捨てられ “000”
- よって 2の補数は 000
- b. 101
- 1の補数:010
- 010 + 1 = 011
- よって 2の補数は 011
- c. 011
- 1の補数:100
- 100 + 1 = 101
- よって 2の補数は 101
(2) 4ビットの場合
- a. 0000
- 1の補数:1111
- 1111 + 1 = 1 0000 (5ビット) → 先頭の 1 を捨てて 0000
- よって 2の補数は 0000
- b. 1001
- 1の補数:0110
- 0110 + 1 = 0111
- よって 2の補数は 0111
- c. 0110
- 1の補数:1001
- 1001 + 1 = 1010
- よって 2の補数は 1010
問題3:負数の解釈(4ビット、2の補数方式)
4ビットで 最上位ビットが 1 の場合は負の数として扱います。
- a. 1111
- 負数。2の補数をとってみると
- 1111 → (1の補数) 0000 → 0000 + 1 = 0001
- 0001 (2進数) は 1
- 元の数は -1
- 負数。2の補数をとってみると
- b. 1000
- 負数。2の補数をとってみると
- 1000 → (1の補数) 0111 → 0111 + 1 = 1000
- 1000 (2進数) は 8
- 元の数は -8
- 負数。2の補数をとってみると
- c. 1010
- 負数。2の補数をとってみると
- 1010 → (1の補数) 0101 → 0101 + 1 = 0110
- 0110 (2進数) は 6
- 元の数は -6
- 負数。2の補数をとってみると
- d. 0101
- 正数(最上位ビットが0)
- 0101 (2進数) は 5
- 元の数は +5
さいごに
1の補数・2の補数は、コンピュータ内部で整数や負数をどのように扱っているかを理解するうえで大切な概念です。特に 2の補数方式 は「負数の表現が容易で、加減算がシンプルに行える」という大きなメリットがあるため、現代のコンピュータでは主流となっています。
練習問題を通して、ぜひ 「ビットを反転させる → 必要なら 1 を加える」 という手順に慣れてみてください。
また、負数を判定する際は「最上位ビット(符号ビット)に注目し、2の補数をとって大小を把握する」流れをしっかり身につけると、演算のしくみがより理解しやすくなるはずです。
Discussion