在比特操作中使用时到底做了什么?

时间:2015-07-10 15:40:49

标签: c++ bit-manipulation bitwise-operators bit-shift bitwise-xor

~iINT_MAX^i之间有什么区别 两者都给出相同的号码。在二进制,但当我们打印否。输出不同,如下面的代码所示

#include <bits/stdc++.h>
using namespace std;
void binary(int x)
{
int i=30;
while(i>=0)
{
    if(x&(1<<i))
      cout<<'1';
    else
      cout<<'0';
    i--;  
}
cout<<endl;
}
int main() {
  int i=31;
  int j=INT_MAX;
  int k=j^i;
  int g=~i;
  binary(j);
  binary(i);
  binary(k);
  binary(g);
  cout<<k<<endl<<g;
 return 0;
}

我得到输出为

1111111111111111111111111111111
0000000000000000000000000011111
1111111111111111111111111100000
1111111111111111111111111100000  
2147483616
-32

为什么k和g不同?

6 个答案:

答案 0 :(得分:7)

$conn = ConnectionManager::get('default'); //some code $conn = ConnectionManager::get('get'); K不同 - 最重要的一点是不同的。您不显示它,因为您只显示31位。在g中,最高有效位为0(作为两个0的XOR的结果)。在k中,作为0的否定结果(g的最高位),它为1。

答案 1 :(得分:3)

您的测试存在缺陷。如果输出整数位的全部,则see that the values are not the same

您现在还会看到 NOT XOR 的操作不同。

答案 2 :(得分:2)

尝试在二进制函数中设置i = 31;它不是打印整数。然后,您会看到kg不一样; g在结尾处有“否定”标记(1)。

整数使用第32位来指示数字是正数还是负数。您只打印31位。

~是按位NOT; ~11100 = ~00011 ^是按位异或,如果只有一个

,则为真

答案 3 :(得分:1)

~是按位NOT,它将翻转所有位

实施例

 a:  010101
~a:  101010

^XOR,这意味着一个位1 iff 一位是0而另一位是{{1} },否则设置为1

0

答案 4 :(得分:0)

你想要UINT_MAX。并且你想使用unsigned int的INT_MAX只是没有设置有符号的位。 〜将翻转所有位,但^将保留符号位,因为它未在INT_MAX中设置。

答案 5 :(得分:0)

这句话是错误的:

  

~iINT_MAX^i ......两者都给出相同的号码。二进制

出现的原因是它们以二进制形式给出相同的数字 是因为你只打印出每个数字的32位中的31位。 你没有打印标志位。

INT_MAX的符号位为0(表示正有符号整数) 在INT_MAX^i期间没有更改 因为i的符号位也是0, 并且两个零的XOR为0.

~i的符号位为1,因为i的符号位为0且为0 ~操作翻了它。

如果你打印了所有32位,你会在二进制输出中看到这种差异。