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