Странный вывод для побитового NOT

Я пытаюсь взять одно дополнение к 0, чтобы получить 1, но я получаю 4294967295. Вот что я сделал:

 unsigned int x = 0;
 unsigned int y= ~x;
 cout << y;

Мой вывод - 4294967295, но я ожидаю 1, почему это так? Кстати, я делаю это на С++.

Ответ 1

Почему вы ожидаете 1? Побитовое дополнение переворачивает все биты.

00000000000000000000000000000000 = 0
              |
          bitwise NOT
              |
              v
11111111111111111111111111111111 = 4294967295

Возможно, вы думаете о логическом NOT. В С++ это написано как !x.

Ответ 2

Вы должны посмотреть на это в двоичном формате, чтобы точно понять, что происходит.

unsigned int x = 0, 00000000 00000000 00000000 00000000 в памяти.

Оператор ~x переворачивает все биты, что означает, что вышеперечисленное превращается в:

11111111 11111111 11111111 11111111

который преобразуется в 4294967295 в десятичной форме.

XOR позволит вам перевернуть только определенные биты. Если вы хотите перевернуть наименее значимый бит, используйте x ^ 1 вместо этого.

Ответ 3

Откуда у вас было ожидание 1?

Ваше понимание побитовых операций ясно показывает отсутствие, было бы разумно проработать их сначала, прежде чем публиковать здесь...

вы не сбиваете с толку !, который является логическим NOT, не так ли?

a ~ побитовое дополнение или побитовая операция НЕ переворачивает все биты от 1 до 0 и наоборот в зависимости от того, где в битовой маске задано, например, 1 является

00000000 00000000 00000000 00000001

выполняет ~ побитовое NOT, которое переворачивает его на

11111111 11111111 11111111 11111110

который дает вам максимальное значение менее 1 целочисленного типа данных в 32-битной системе.

Вот достойная ссылка на это, которая показывает вам, как сделать bit-twiddling здесь.

Ответ 4

Целое число больше, чем 1 бит (это 4 байта или 32 бита). Отметив это, вы перевернули все, поэтому в этом случае 00000... станет 11111...

Ответ 5

~ переворачивает все биты на входе. Ваш вход представляет собой неподписанный int, который имеет 32 бита, все из которых равны 0. Перевертывание каждого из этих 0-бит дает вам 32 1 бит, что является двоичным для этого большого числа.

Если вы хотите перевернуть наименее значимый бит, вы можете использовать y = x ^ 1 - то есть вместо этого использовать XOR.

Ответ 6

Вы можете использовать

unsigned int y= !x;

чтобы получить y = 1;