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

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

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

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

14
задан Edwin Pratt 22 June 2018 в 09:51
поделиться

5 ответов

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

00000000000000000000000000000000 = 0
              |
          bitwise NOT
              |
              v
11111111111111111111111111111111 = 4294967295

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

26
ответ дан 1 December 2019 в 07:50
поделиться

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

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

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

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

00000000 00000000 00000000 00000001

выполнение ~ побитового NOT на этом переворачивает его в

11111111 11111111 11111111 11111110

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

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

2
ответ дан 1 December 2019 в 07:50
поделиться

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

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

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

11111111 11111111 11111111 11111111

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

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

6
ответ дан 1 December 2019 в 07:50
поделиться

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

0
ответ дан 1 December 2019 в 07:50
поделиться

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

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

0
ответ дан 1 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: