理解两个补语

时间:2012-08-24 04:53:21

标签: algorithm numbers bit-manipulation

我正在努力理解两个补语:

两个补码是否表示此数字无效:

1000

两个补码是否允许使用最高位为正数。 IE浏览器。能

1000

曾代表2 ^ 3?或者它代表-0?

我也很困惑你为什么需要将1添加到一个补码中。

4 个答案:

答案 0 :(得分:1)

在二进制补码中,MSB(最高有效位)设置为1表示负数。要乘以-1得到2的补码数,请执行以下操作:

add one to the number.
reverse all bits after the first one. 

例如:
添加一个之后的10010数字得到:10011在撤消之后得到:01101
这意味着10010为负13.。

添加一个后的数字1000为:1001,后退:0111
这意味着1000为负7。

现在,到你的上一个问题:不。如果使用二进制补码,则不能将MSB用于正数。但是,你可以定义你没有使用二进制补码并使用更高的数字。

答案 1 :(得分:1)

2的补充主要取决于你如何解释这个值,大多数数学*并不关心你是否将数字视为已签名。如果你使用4位,1000是8,也是-8。这里出现了“奇怪的对称性”,因为将它添加到数字与将数字与数字相加(因为只设置了高位,所以没有任何位进位)。它也来自两个补语的定义 - 否定将这个数字映射到自身。

通常,任何数字k代表一组数字{ a | a = xk mod n },其中n是您正在处理的位数的2的幂。这可能有点奇怪的效果是使用模运算的直接结果,无论您将数字视为有符号还是无符号,都是正确的。签名和未签名解释之间的唯一区别是您采用哪个数字作为此类集合的代表。对于无符号,代表是唯一位于0和a之间的n。对于已签名的号码,代表是唯一位于a-(n/2)之间的(n/2)-1

至于为什么需要添加一个,否定的目标是找到x' x' + x = 0。如果你只补充x中的位但没有添加一位,x' + x将不会在任何位置携带,只是总和为“所有”。 “所有1”加1为零,因此添加一个修正x'以使总和变为零。或者(确实不是替代方案),您可以使用~(x - 1),其结果与~x + 1相同。

*签名会影响除法的结果,右移和乘法的高半部分(很少使用,在许多编程语言中,无论如何都不可用)。

答案 2 :(得分:0)

这取决于您用来表示数字的位数。

最左边(最大)位的值为-1 *(2 ** N-1),或者在这种情况下为-8。 (N是位数。)后续位是它们的正常值。

所以

1000

是-8

1111

是-1     0111 是7。

但是,如果你有8位,这些就会变成不同的值!     0000 1000

为正8.只有最左边的位为答案添加负值。

在任何一种情况下,数字范围都来自     1000 .... 0

对于具有N位的-2 **(N-1) 到

0111 .... 1 这是2 **(N-1)-1。 (这只是正常的基数2,因为最左边的位是0。)

答案 3 :(得分:0)

二重补充基于两个要求:

  • 数字由固定的位数表示;
  • x + -x = 0。

假设有四位表示,比如说,我们有

0 + -0 = 0000 + -0000 (base 2) = 0000  =>  -0000 = 0000
1 + -1 = 0001 + -0001 (base 2) = 0000  =>  -0001 = 1111 (carry falls off the end)

现在我们有了构建模块,一滴归纳将向您显示“翻转位并添加1”算法正是您需要将正数转换为其二进制补码否定表示。