1の補数とは?
2進数の1の補数は、すべてのビットを反転(フリップ)して作ります。つまり0は1に、1は0に置き換えるだけです。結果は使用するビット数によって変わるため、4・8・16・32ビットといったビット幅をあらかじめ選ぶ必要があります。この表現方式は初期のコンピュータで符号付き整数を表すために使われていました。現在でも2進数演算の学習や、誤り検出に用いるチェックサムを理解するうえで欠かせない考え方です。
この計算機の使い方
0以上の10進数を入力し、ビット幅を選ぶだけです。計算機はその数値を指定した幅でマスクし、全ビットを反転したうえで、結果を2進数・10進数の両方で表示します。入力した数値が選んだ幅で表せる範囲を超える場合は、その幅に収まる下位ビットだけを残してから反転します。
計算式の解説
計算は $$\text{ones} = \left(\sim n\right) \,\&\, \left(2^{w} - 1\right)$$ で行います。\(2^{w} - 1\) は w 個の1が並んだマスクです(8ビットなら 11111111 = 255)。ビット否定(\(\sim\))が n の全ビットを反転し、マスクが選んだ幅を超える上位ビットを取り除くことで、答えが範囲内に収まります。
計算例
8ビットで数値5を例にとります。2進数では \(5 = 00000101\) です。全ビットを反転すると 11111010 となり、これは10進数で250にあたります。したがって8ビットにおける5の1の補数は 250 です。4ビットの場合、\(5 = 0101\) で、反転すると \(1010 = 10\) になります。
よくある質問
1の補数と2の補数はどう違いますか? 2の補数は1の補数に1を加えたものです。これにより、0の表し方が2通りできてしまう問題を回避できます。
0の1の補数は? 8ビットでは 11111111 = 255 になります。すべてのビットが1に変わるためです。
なぜビット幅によって答えが変わるのですか? ビットの反転は、存在するビットの数に左右されるからです。幅が広いほど先頭に1が多く並び、10進数としての値も大きくなります。