C++ 在按位操作中使用~时,它具体做什么?
C++ 在按位操作中使用~时,它具体做什么?,c++,bit-manipulation,bitwise-operators,bit-shift,bitwise-xor,C++,Bit Manipulation,Bitwise Operators,Bit Shift,Bitwise Xor,~i和INT\u 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--; } c
~i
和INT\u 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;
}
为什么k和g不同?
~
是按位而不是,它将翻转所有位
范例
a: 010101
~a: 101010
^
是XOR
,这意味着如果一位是0
,另一位是1
,则一位将是1
,否则将设置为0
a: 010101
b: 001100
a^b: 011001
K
和g
不同-最高有效位不同。因为只显示31位,所以不显示它。在k
中,最高有效位为0(作为两个0的异或的结果)。在g
中,0(i
的最高有效位)的反运算结果为1。尝试在二进制函数中设置i=31
;它没有打印完整的数字。然后您将看到k
和g
是不同的<代码>g
的末尾有“负”标志(1)
整数使用第32位指示数字是正数还是负数。您只打印了31位
~
不是按位的~11100 = ~00011
^
是按位异或,如果只有一个或另一个测试有缺陷,则为true。如果您输出整数的所有位,您将
您现在还将看到NOT和XOR不是同一个操作。您想要UINT\u MAX。并且您想要使用unsigned int的int\u MAX没有符号位集。~将翻转所有位,但^将保留符号位,因为它未在INT_MAX中设置。此语句为false:
~i
和INT\u MAX^i
。。。二者在二进制中给出相同的编号
原因似乎是它们给出了相同的二进制数
是因为您只打印出了每个数字32位中的31位。
您没有打印符号位
INT_MAX
的符号位为0(表示正有符号整数)
并且在INT\u MAX^i期间不会更改
因为i
的符号位也是0,
两个零的异或为0
~i
的符号位为1,因为i
的符号位为0,而
~
操作将其翻转
如果打印所有32位,您将在二进制输出中看到这种差异。~
是而不是运算符^
是一个异或运算符。你的书有什么问题吗?你的互联网连接?你的研究成果在哪里?@Ravish:好吧,请别偷懒了。这些运算符的含义在所有地方都得到了很好的解释。另外,@RavishMahur“仔细看,它是正确的”不,#include
不正确。@Ravish:你没有认真写问题,我把问题看得很好,我正在解释运算符是如何工作的。您生成输出的方式不正确,因此问题的前提不正确。
a: 010101
b: 001100
a^b: 011001