什么是反码(一补数)?
一个二进制数的反码(英文为 One's Complement,又称"一补数")是把它的每一位都取反得到的:原来是 0 的变成 1,原来是 1 的变成 0。由于结果取决于使用了多少个二进制位,所以必须先指定一个位宽,比如 4 位、8 位、16 位或 32 位。这种表示法曾用于早期计算机中表示有符号整数,时至今日,在学习二进制运算以及错误检测校验和(checksum)时仍然十分重要。
如何使用本计算器
输入一个非负的十进制数,选择一个位宽,计算器会先把这个数按所选位宽截取(掩码),然后翻转全部二进制位,并同时给出结果的二进制和十进制形式。如果你输入的数字超出了该位宽所能表示的范围,则只保留位宽以内的最低几位,再进行翻转。
公式解析
计算公式为 $$\text{Result} = \left(\sim\left(\text{Number} \,\&\, M\right)\right) \,\&\, M, \quad M = 2^{\text{Width}} - 1$$。其中 \(2^{w} - 1\) 是一个由 w 个 1 组成的掩码(例如 8 位时为 11111111 = 255)。按位取反运算(~)会翻转 n 的每一位,而掩码则会舍弃所选位宽以上的所有高位,从而保证结果落在有效范围之内。
示例演算
以 8 位下的数字 5 为例。在二进制中,\(5 = 00000101\)。把每一位翻转后得到 \(11111010\),对应十进制的 250。因此,5 在 8 位下的反码为 250。而在 4 位下,\(5 = 0101\),翻转后为 \(1010 = 10\)。
常见问题
反码与补码(二补数)有什么区别?补码(Two's Complement)是在反码的基础上再加 1,这样可以避免出现"正零"和"负零"两种零的表示。
0 的反码是多少?在 8 位下为 11111111 = 255 —— 所有位都变成了 1。
为什么结果会随位宽而变化?翻转操作取决于一共有多少个二进制位;位宽越大,前面补的 1 就越多,得到的十进制值也就越大。