什麼是一補數?
一個二進位數的一補數,就是把每個位元都反轉(flip):0 變成 1、1 變成 0。由於結果會隨著使用的位元數而不同,因此必須先指定位元寬度,例如 4、8、16 或 32 位元。早期電腦曾用這種表示法來編碼帶正負號的整數,而在學習二進位運算與錯誤偵測校驗碼(checksum)時,它至今仍十分重要。
如何使用這個計算機
輸入一個非負的十進位數字並選擇位元寬度,計算機會先把數字遮罩(mask)到該寬度,接著反轉所有位元,最後同時顯示結果的二進位與十進位形式。如果你輸入的數字超出該寬度可容納的範圍,系統會在反轉之前只保留寬度內最低位的位元。
公式解析
計算式為 $$\text{ones} = (\sim n) \,\&\, (2^w - 1)$$。其中 \(2^w - 1\) 是一個由 w 個 1 組成的遮罩(以 8 位元為例就是 \(11111111 = 255\))。位元 NOT 運算(\(\sim\))會反轉 n 的每個位元,而遮罩則會捨棄超出所選寬度的位元,讓答案維持在有效範圍內。
實例演算
以 8 位元的數字 5 為例。在二進位中,\(5 = 00000101\),把每個位元反轉後得到 \(11111010\),換算成十進位等於 250。因此 5 在 8 位元下的一補數為 250。若改用 4 位元,\(5 = 0101\),反轉後為 \(1010 = 10\)。
常見問題
一補數和二補數有什麼不同?二補數是在一補數的基礎上再加 1,如此可避免「零」出現兩種不同的表示方式。
0 的一補數是多少?在 8 位元下為 \(11111111 = 255\),也就是所有位元全部變成 1。
為什麼答案會隨位元寬度改變?反轉位元的結果取決於有多少個位元;寬度越大,前面補上的 1 越多,算出的十進位數值也就越大。