对一元补码算子的混淆

时间:2013-04-11 16:58:20

标签: bits

2的按位一元补码算子(〜)为-3。我读了一些二进制表示中的值2为0010,而Bitwise一元补码运算符将位从0更改为1,反之亦然。所以~2的值是1101.这意味着-3。但我的困惑是为什么他们把2的二进制表示作为0010.根据我的int是32位。那么为什么2不能00000000000000000000000000000010而且它的一元补充是11111111111111111111111111111101?我知道错了,但为什么?请解释一下?

1 个答案:

答案 0 :(得分:0)

您的问题的答案是“选择二进制补码,而不是使用二进制补码,因为它具有几个方便的特性,使得算术更容易在数字电路中实现”。

我相信从您所提问题的措辞来看,有些插图会有所帮助。

要完全理解这一点,您仍然需要阅读两个补码表示法和算术-它们的工作原理和历史-但是我将尝试以类似故事的方式在这里解释基础知识。

让我们说我们有4位代表一个有符号整数值。

  • 4位只能表示16个不同的值(16个不同 可以用4位来制作不同的“样式”)... 0000、0001、0010, 0011、0100,... 1111(尝试一下,可以更轻松地查看和开发 模式以柱状格式显示,您将在下面看到我完成的操作
  • 确定要表示的16个值
  • 可以说0000代表零,0001代表1,以此类推,以此类推,但是负数呢?
  • 因为零已经“占据了一位”,我们可以表示15个其他整数,所以很明显我们不能表示相同数量的正值和负值。
  • 我们做出选择:我们的范围从-8到+7(我们可能说过-9到+6或-7到+8等,但是您会在下面看到此选择的回报)
  • 现在哪些位模式应该代表底片?
  • 我相信您会同意,如果添加到其加和逆中的每个数字都为零,而无需我们求助于if-negative-then-else(如果为正)逻辑,那将非常好。例如。如果+3代表0011,并且我们对1101进行(二进制)加法,则得到的结果(进位1)0000。忽略进位,我们得到零。这使位模式1101成为标签“ -3”的明显获胜者。
  • 您可以以相同的方式使用剩余的值,您应该得到以下内容... -8 1000 -7 1001 -6 1010 -5 1011 -4 1100 -3 1101 -2 1110 -1 1111 0 0000 +1 0001 +2 0010 +3 0011 +4 0100 +5 0101 +6 0110 +7 0111

具有以下美观便捷的特征

  • “自然计数位模式”。向下看最右边的列,您会看到0 1 0 1 ...,然后在下一列中看到0 0 1 1 ...,然后是0 0 0 0 1 ...,依次完美地运行到肯定
  • 递增“环绕”(0、1,2,... 7,-8,-7,-6,...- 1,0、1,...等,递减也是如此)
  • 加法逆的二进制加法给出零,没有多余的逻辑来处理符号
  • 所有负数的第一位都为1,所有零都以0开始。(第一位称为“符号位”。)
  • 可通过以下规则/算法获得加法逆:“将所有位取反,递增,舍弃进位”。魔法!再次尝试3: 3 : 0011 ~ : 1100 (the NOT operator gives "one's complement") +1: 1101 (the two's complement representation of -3) ~ : 0010 +1: 0011 (back to +3) etc
  • 这是补码符号

如果您了解这个4位的故事,您会发现它可以轻松扩展到适用于32位带符号整数。