2015-07-10 54 views
-11

~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和克不同?

+0

“〜”是一个“NOT”运算符。 '^'是一个'XOR'运算符。 –

+0

所以笏〜确实做到了吗? –

+12

你的书有什么问题?您的互联网连接?你的研究工作在哪里? –

回答

1

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

a: 010101 
~a: 101010 

^XOR,这意味着一个位将是1IFF一个比特是0和其他是1,否则它将设为0

a: 010101 
    b: 001100 
a^b: 011001 
+0

你没有仔细阅读这个问题 –

+3

@Ravish:你没有仔细写下这个问题 –

+1

我看了这个问题就好了,我正在解释操作员是如何工作的。您生成输出的方式不正确,因此您问题的前提不正确。 – CoryKramer

7

Kg是不同的 - 最显著位是不同的。你不显示它,因为你只显示31位。在k最高有效位是0(作为两个0的异或的结果)。在g中,作为0的否定结果(i的最高有效位),结果为1。

2

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

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

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

0

你想要UINT_MAX。而你想使用unsigned int的INT_MAX只是没有设置有符号位。 〜将翻转所有的位,但是^将单独留下符号位,因为它不是在INT_MAX中设置的。

0

这种说法是错误的:

~iINT_MAX^i ...都给予同样没有。在二进制

它之所以出现他们给二进制 相同数量是因为你打印出仅各个号码的32位的31。 您没有打印符号位。

INT_MAX的符号位为0(表示一个正符号整数) 和期间INT_MAX^i 由于i符号位也为0, 不改变和两个零的XOR是0

~i的符号位为1,因为i的符号位为0,并且操作将其翻转过来。

如果你打印所有32位,你会看到二进制输出的差异。

相关问题