Унарный оператор и побитовые тесты дают отрицательные результаты - PullRequest
0 голосов
/ 22 октября 2019

Я изучал побитовые операторы, и они имеют смысл до тех пор, пока с ними не используется одинарное дополнение. Может кто-нибудь объяснить мне, как это работает?

Например, это имеет смысл, однако остальные вычисления, кроме них, не делают:

1&~0 = 1   (~0 is 1 -> 1&1 = 1)
~0^~0 = 0  (~0 is 1 -> 1^1 = 0)
~1^0 = 1   (~1 is 0 -> 0^1 = 1)
~0&1 = 1   (~0 is 1 -> 1&1 = 1)
~0^~1 = 1  (~0 is 1, ~1 is 0 -> 1^0 = 1)
~1^~1 = 0  (~1 is 0 -> 0^0)

Остальные полученные результаты отрицательны(или очень большое число, если оно не подписано) или противоречит логике, которую я знаю. Например:

0&~1 = 0   (~1 = 0 therefor 0&0 should equal 0 but they equal 1)
~0&~1 = -2
~1|~0 = -1

и т. Д. Где-нибудь вы можете указать мне, чтобы узнать об этом?

Ответы [ 3 ]

1 голос
/ 22 октября 2019

Они действительно имеют смысл, когда вы расширяете их немного больше. Однако следует помнить несколько вещей:

  1. Битовый И возвращает 1 только тогда, когда оба участвующих бита равны 1. В противном случае он возвращает 0. 1 & 1 = 1, 0 & что угодно =0.

  2. Побитовое ИЛИ возвращает 1, когда любой из битов в этой позиции равен 1, и 0 только если все биты в этой позиции равны 0. 1 |0 = 1, 1 |1 = 1, 0 |0 = 0.

  3. Числа со знаком, как правило, делаются как дополнение к двум (хотя процессор не должен делать это таким образом!). Помните, что с дополнением до двух вы инвертируете и добавляете 1, чтобы получить величину, когда максимальная позиция бита равна 1.

Предполагая 32-разрядное целое число, вы получите следующие результаты:

 0 & ~1 = 0 & 0xFFFFFFFE = 0
~0 & ~1 = 0xFFFFFFFF & 0xFFFFFFFE = 0xFFFFFFFE (0x00000001 + 1) = -2
~1 | ~0 = 0xFFFFFFFE & 0xFFFFFFFF = 0xFFFFFFFF (0x00000000 + 1) = -1
0 голосов
/ 22 октября 2019

0&~1 = 0 (~1 = 0 для этого 0&0 должно равняться 0, но они равны 1)

~1 равно -2. Если вы перевернете все биты номера дополнения до двух, вы умножите его на -1 и вычтите 1 из результата. Независимо от этого 0 имеет 0 для всех битов, поэтому результат & в любом случае будет 0.

~0&~1 = -2

~0 имеет все биты, поэтому ~0&~1 это просто ~1. Для которого -2.

~1|~0 = -1

~0 установлены все биты, поэтому результат | равен ~0 (= -1) независимо от того, с чем это ИЛИ.

0 голосов
/ 22 октября 2019

~1 = 0 - Нет, это не так. Это равно -2. Давайте возьмем восемь битов два дополнения в качестве примера. Десятичное число 1 имеет представление 0000 0001. Таким образом, ~1 будет иметь 1111 1110, что представляет собой два дополнения представления -2.

...