Как сделать битовые NOR ворота
Я пытаюсь понять код из ответа, который я получил сегодня сегодня:
a=0b01100001
b=0b01100010
bin((a ^ 0b11111111) & (b ^ 0b11111111))
Это мое понимание
bin
означает, что результат будет в двоичном виде.a
это процессы, проходящие через ворота0b
означает форму базы 2
Может ли кто-нибудь объяснить остальное? Я запутался 11111111
, &
это и ворота (в замешательстве, почему это разделяет два). И как бы вы изменили это, чтобы работать для любых других ворот, например, XOR, NAND или...?
3 ответа
a ^ 0b11111111 #exclusive or's each bit in a with 1, inverting each bit
>>> a=0b01100001
>>> bin(a ^ 0b11111111)
'0b10011110'
>>> bin((a ^ 0b11111111) & (b ^ 0b11111111))
'0b10011100'
Это отличается от использования оператора ~, поскольку ~ возвращает отрицательный двоичный результат.
>>> bin(~a & ~b)
'-0b1100100
Причина в том, что оператор ~ инвертирует все биты, используемые для представления числа, включая первые 0, которые обычно не отображаются, что приводит к отрицательному результату в виде дополнения 2. Используя ^ и 8-битную двоичную маску, инвертируются только первые 8 бит.
Начиная с исходного ответа, который объясняет, как можно реализовать шлюз NOR, используя AND и NOT:
Вы запрашиваете битовую операцию NOR:
r = not (a or b)
Кроме того, вы можете использовать закон Де Моргана, который гласит:
r = (not a) and (not b)
Афиша, которая переводит этот псевдокод в Python, который вы опубликовали. По какой-то причине он использовал ^ 0b11111111
делать двоичный файл НЕ, а не просто ~
, что я бы выбрал. Если мы переключимся (a ^ 0b11111111)
проще ~
тогда мы получим:
bin(~a & ~b)
Это выражение, как вы пишете "(не а) и (не б)" в Python. ~
означает НЕ и &
означает И.
Двоичный НЕ переворачивает все биты в числе. 0 становится 1, а 1 становится 0. Прямой способ сделать это с ~
, Косвенным способом перевернуть все биты числа является XOR со всеми 1 битами. Это имеет тот же эффект, это просто дольше писать.
Или, если быть более точным, это имеет почти тот же эффект. ^ 0b11111111
переворачивает первые восемь бит числа, потому что есть восемь 1. В то время как ~
переворачивает все биты. Если вас интересуют только первые 8 бит, вы можете добавить & 0b11111111
, который усекает результаты до 8 бит:
>>> bin((~a & ~b) & 0b11111111)
'0b10011100'
На мой взгляд, это лучше, чем таинственный ^ 0b11111111
,
^
является оператором XOR. XOR означает исключительное ИЛИ. Один из операндов ^
это последовательность из них. По сути это означает, что каждый бит в другом операнде (то есть, либо a
или же b
) будет перевернут. После выполнения двух отдельных операций XOR их результаты обрабатываются OR.
Если смотреть вне битов и побитовых операций, если вы видите это из области логических операций, код по сути делает (! A ) ^ (! B)
который в соответствии с законом Деморгана идентичен ! (A v B)
которая является операцией NOR.