Я пытаюсь взять один ' s дополняет 0 до 1, но я получаю 4294967295. Вот что я сделал:
unsigned int x = 0;
unsigned int y= ~x;
cout << y;
Мой вывод 4294967295, но я ожидаю 1, почему это так? Кстати, я делаю это на C ++.
Почему вы ожидаете 1? Побитовое дополнение переворачивает все биты.
00000000000000000000000000000000 = 0
|
bitwise NOT
|
v
11111111111111111111111111111111 = 4294967295
Возможно, вы думаете о логическом НЕ . В C ++ это записывается как ! X
.
Откуда вы взяли ожидание 1?
Ваше понимание побитовых операций явно недостаточное, было бы разумно сначала проработать их, прежде чем писать здесь...
Вы не путаете с ! , который является логическим NOT, не так ли?
операция ~ побитового дополнения или побитового NOT переворачивает все биты с 1 на 0 и наоборот в зависимости от того, где в битовой маске они установлены, так что, например, 1 это
00000000 00000000 00000000 00000001
выполнение ~ побитового NOT на этом переворачивает его в
11111111 11111111 11111111 11111110
что дает вам максимальное значение меньше 1 для целочисленного типа данных на 32-битной системе.
Вот достойная ссылка на это, которая показывает, как делать битовые перестановки здесь.
Вы должны посмотреть на это в двоичном формате, чтобы точно понять, что происходит.
unsigned int x = 0
, это 00000000 00000000 00000000 00000000
в памяти.
Оператор ~ x
переворачивает все биты, то есть приведенное выше превращается в:
11111111 11111111 11111111 11111111
, который преобразуется в 4294967295 в десятичной форме.
XOR позволит вам перевернуть только определенные биты. Если вы хотите перевернуть только младший значащий бит, используйте вместо него x ^ 1
.
Целое число - это больше, чем 1 бит (это 4 байта или 32 бита). Отмечая это, вы переворачиваете все, поэтому в этом случае 00000 ... становится 11111 ...
~ переворачивает все биты на входе. Ваш вход представляет собой беззнаковое целое число, которое имеет 32 бита, все из которых равны 0. Перевернув каждый из этих 0-битов, вы получите 32 1-битных, которые являются двоичными для этого большого числа.
Если вы хотите перевернуть только младший значащий бит, вы можете использовать y = x ^ 1
- то есть вместо этого использовать XOR.