Странный вывод для побитового НЕ - PullRequest
14 голосов
/ 11 августа 2010

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

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

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

Ответы [ 6 ]

26 голосов
/ 11 августа 2010

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

00000000000000000000000000000000 = 0
              |
          bitwise NOT
              |
              v
11111111111111111111111111111111 = 4294967295

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

6 голосов
/ 11 августа 2010

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

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

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

11111111 11111111 11111111 11111111

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

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

2 голосов
/ 11 августа 2010

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

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

Вы не путаете с ! что является логическим НЕ, а вы?

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

00000000 00000000 00000000 00000001

, выполняя ~ поразрядно НЕ, что переводит его на

11111111 11111111 11111111 11111110

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

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

0 голосов
/ 07 декабря 2016

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

unsigned int y= !x;

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

0 голосов
/ 11 августа 2010

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

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

0 голосов
/ 11 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...