【问题标题】:Bitwise addition of opposite signs相反符号的按位相加
【发布时间】:2014-04-26 10:08:59
【问题描述】:
int main(){
        int a = 10, b = -2;
        printf("\n %d \n",a^b);
        return 0;
}

这个程序输出 -12。我不明白怎么做。请解释一下。

0111 1110 -> 2's complement of -2
0000 1010 -> 10
---------
0111 0100

这个 no 似乎大于 -12 并且是 +ve。但是我是如何将 o/p 设为 -12 的呢?

【问题讨论】:

  • 提示:12 的 2 补码是什么?
  • -2 实际上是 11111...10

标签: c bit-manipulation bitwise-operators twos-complement bitwise-xor


【解决方案1】:

要找到负整数的二进制补码,首先要找到其大小的二进制表示。然后翻转它的所有位,即应用按位NOT 运算符!。然后添加1。因此,我们有

2       -->  0000 0000 0000 0010
~2      -->  1111 1111 1111 1101  // flip all the bits
~2 + 1  -->  1111 1111 1111 1110  // add 1

因此,-2 在二进制补码中的二进制表示是

1111 1111 1111 1110

现在,假设int 的大小为4,则ab 在二进制补码中的表示为-

a -->        0000 0000 0000 1010  --> 10
b -->        1111 1111 1111 1110  --> -2
a^b -->      1111 1111 1111 0100  --> -12

运算符^ 是按位XOR,或独占OR 运算符。如果对ab 的相应位进行操作,并且仅当位不是0 或两者都不是1 时计算为1,否则计算为0

【讨论】:

  • 1111 1111 1111 0100 - 这不是 -12 吗?之前设置的位发生了什么。如果 MSB 设置为 1,我们将其视为负号。从第 5 位到第 15 位设置的位会发生什么变化。
  • @Angus 那是符号扩展。 10100 是 -12,在数字左侧添加符号位不会改变其值
  • @Angus 这是规则。如果 MSB 为1,则该数字为负数。要获得它的模数,翻转所有位并加 1。
  • @ajay 将其添加到您的答案中!这将对未来的用户有所帮助!
  • @ajay 按位不应该是~,而不是!。那是~2 + 1
【解决方案2】:

看起来合法!

1111 1110   (-2)
xor
0000 1010   (10)
=
1111 0100   (-12)

【讨论】:

    【解决方案3】:

    ^ 是按位异或,不是幂

    a = 10 = 0000 1010
    b = -2 = 1111 1110
    ──────────────────
    a^b    = 1111 0100 = -12
    

    【讨论】:

      【解决方案4】:
      (int) -2 = 0xfffffffe
      
      (int) 10 = 0x0000000a                                  
      
      0xfffffffe ^ 0x0000000a = fffffff4 = (int) -12
      

      【讨论】:

      • 使用代码片段回答时,请描述它的作用以及它如何解决问题。
      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多