-11

~i和有什么区别 两者INT_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不同?

4

6 回答 6

7

K并且g是不同的 - 最重要的位是不同的。您不显示它,因为您只显示 31 位。最高有效位为k0(作为两个 0 的 XOR 的结果)。其中g1 是 0(的最高有效位i)取反的结果。

于 2015-07-10T15:46:40.627 回答
3

你的测试有缺陷。如果您输出整数的所有位,您会看到这些值是不一样的

您现在还将看到NOTXOR不是同一个操作。

于 2015-07-10T15:48:53.043 回答
2

尝试i = 31在您的二进制函数中设置;它没有打印整数。然后你会看到kg不一样;g最后有'负'标志(1)。

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

~按位非;~11100 = ~00011 ^是按位异或,如果只有一个或另一个,则为真

于 2015-07-10T15:48:43.393 回答
1

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

例子

 a:  010101
~a:  101010

^XOR,这意味着一个位将是1 当且仅当一位是0,另一个是1,否则将设置为0

  a: 010101
  b: 001100
a^b: 011001
于 2015-07-10T15:45:19.237 回答
0

你想要 UINT_MAX。而你想使用 unsigned int 的 INT_MAX 只是没有设置有符号位。~ 将翻转所有位,但 ^ 将不理会符号位,因为它未在 INT_MAX 中设置。

于 2015-07-10T15:50:16.717 回答
0

这种说法是错误的:

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

看起来它们以二进制形式给出相同数字的原因是因为您只打印了每个数字的 32 位中的 31 位。您没有打印符号位。

的符号位INT_MAX为 0(表示正符号整数),INT_MAX^i 由于符号位i也为 0,两个 0 的异或为 0,因此期间不变。

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

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

于 2015-07-10T15:52:16.310 回答