Как сделать битовые 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.

Другие вопросы по тегам