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