~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不同?
答案 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
;它不是打印整数。然后,您会看到k
和g
不一样; 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)
这句话是错误的:
~i
和INT_MAX^i
......两者都给出相同的号码。二进制
它出现的原因是它们以二进制形式给出相同的数字 是因为你只打印出每个数字的32位中的31位。 你没有打印标志位。
INT_MAX
的符号位为0(表示正有符号整数)
在INT_MAX^i
期间没有更改
因为i
的符号位也是0,
并且两个零的XOR为0.
~i
的符号位为1,因为i
的符号位为0且为0
~
操作翻了它。
如果你打印了所有32位,你会在二进制输出中看到这种差异。