В чем разница между ~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 разные?
K
а также g
отличаются — самый важный бит отличается. Вы не отображаете его, так как вы показываете только 31 бит. В k
самый значимый бит равен 0 (как результат XOR двух нулей). В g
это 1 в результате отрицания 0 (самый значимый бит i
).
Ваш тест ошибочен. Если вы выводите все из целых битов, вы будете увидеть, что значения не совпадают.
Вы также теперь увидите, что НЕ а также XOR не та же операция.
Попробуйте установить i = 31
в вашей двоичной функции; это не печать целого числа. Вы увидите, что k
а также g
не одинаковы; g
имеет «отрицательный» флаг (1) в конце.
Целые числа используют 32-й бит, чтобы указать, является ли число положительным или отрицательным. Вы печатаете только 31 бит.
~
поразрядно НЕ; ~ 11100 = ~ 00011
^
побитовый XOR, или истина, если только один или другой
~
побитовый NOT
, будет перевернуть все биты
пример
a: 010101
~a: 101010
^
является XOR
, это значит, что немного будет 1
тогда и только тогда один бит 0
а другой 1
в противном случае он будет установлен на 0
,
a: 010101
b: 001100
a^b: 011001
Вы хотите UINT_MAX. И вы хотите использовать только для INT_MAX без знака int не установлен бит со знаком. ~ перевернет все биты, но ^ оставит бит знака один, потому что он не установлен в INT_MAX.
Это утверждение неверно:
~i
а такжеINT_MAX^i
… оба дают одинаковое нет. в двоичном
Причина этого появляется что они дают одинаковое число в двоичном
потому что вы распечатали только 31 из 32 бит каждого числа.
Вы не напечатали бит знака.
Знаковый бит INT_MAX
0 (указывает на положительное целое число со знаком)
и не изменяется во время INT_MAX^i
потому что знак немного i
также 0,
и XOR двух нулей равен 0.
Знаковый бит ~i
1, потому что знаковый бит i
было 0 и
~
операция перевернула его.
Если вы напечатаете все 32 бита, вы увидите эту разницу в двоичном выводе.