Что именно делает ~ при использовании в битовых операциях?

В чем разница между ~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 разные?

-11

Решение

K а также g отличаются — самый важный бит отличается. Вы не отображаете его, так как вы показываете только 31 бит. В k самый значимый бит равен 0 (как результат XOR двух нулей). В g это 1 в результате отрицания 0 (самый значимый бит i).

7

Другие решения

Ваш тест ошибочен. Если вы выводите все из целых битов, вы будете увидеть, что значения не совпадают.

Вы также теперь увидите, что НЕ а также XOR не та же операция.

3

Попробуйте установить i = 31 в вашей двоичной функции; это не печать целого числа. Вы увидите, что k а также g не одинаковы; g имеет «отрицательный» флаг (1) в конце.

Целые числа используют 32-й бит, чтобы указать, является ли число положительным или отрицательным. Вы печатаете только 31 бит.

~ поразрядно НЕ; ~ 11100 = ~ 00011
^ побитовый XOR, или истина, если только один или другой

2

~ побитовый NOT, будет перевернуть все биты

пример

 a:  010101
~a:  101010

^ является XOR, это значит, что немного будет 1 тогда и только тогда один бит 0 а другой 1в противном случае он будет установлен на 0,

  a: 010101
b: 001100
a^b: 011001
1

Вы хотите UINT_MAX. И вы хотите использовать только для INT_MAX без знака int не установлен бит со знаком. ~ перевернет все биты, но ^ оставит бит знака один, потому что он не установлен в INT_MAX.

0

Это утверждение неверно:

~i а также INT_MAX^i … оба дают одинаковое нет. в двоичном

Причина этого появляется что они дают одинаковое число в двоичном
потому что вы распечатали только 31 из 32 бит каждого числа.
Вы не напечатали бит знака.

Знаковый бит INT_MAX 0 (указывает на положительное целое число со знаком)
и не изменяется во время INT_MAX^i
потому что знак немного i также 0,
и XOR двух нулей равен 0.

Знаковый бит ~i 1, потому что знаковый бит i было 0 и
~ операция перевернула его.

Если вы напечатаете все 32 бита, вы увидите эту разницу в двоичном выводе.

0
По вопросам рекламы [email protected]