補数、ビット演算は面白い

ビット演算の中で、「2の補数」と「1の補数」という概念があります。
今まで理解が不十分で、なぜ「2の補数」なのか「0の補数」でないのか、よくわからなかったのですが、この度ある本の説明で腑に落ちました。

この説明がよかったのは、まず10進数から説明していることです。

■10進数での9の補数、10の補数
まず、123という3桁の数を考えましょう。
9の補数でキーとなる数は、999(3桁なら)です。
そこで、123の各位について、9との差を取ります。得られた数876が9の補数となります。
123 元の数
876 9の補数
999 和
このようにして得られたので、元の数と9の補数の和は、必ずすべての桁が9になります。
さて、10の補数はというと、キーになる数は1000(3桁の場合)です。
つまり、1000から元の数を引くのですが、同時に9の補数に1を足しても求めることができます。

■2進数での1の補数、2の補数
2進数に話を戻します。
2進数101を元の数とします。
1の補数においてのキーとなる数は111ですので、1の補数は各位において1との差を求め、010となります。
101
010
111
この1の補数は、2進数においてはビット反転というより原始的な演算によって求めることができます。
2の補数は、1の補数に1つ加算したもので、この場合は011です。

■2の補数が負の数を表現している
2の補数には、特別な性質があります。それは、元の数との和が1000となるのです。これは、下3桁だけみると0になります。
つまり、数のデータサイズに合わせた桁数、例えば1バイトなら8桁、の2の補数は、元の数と足すとオーバーフローになり0になります。
元の数と足して0になるので負の数を表すことができるのです。
1の補数はビット反転、
2の補数はオーバーフローという、2進数の加算器の原始的な性質から重要なのです。