Как сделать побитовый NOR Gate в Python (редактирование математики Python для меня)

Скажи, что я должен был написать это:

a=01100001 
b=01100010 
c=01100011 
d=01100100 
e=01100101 

теперь каждая буква напоминает заданные цифры, как бы я справился со сходными значениями:

Python хотел бы сделать это:

a + b = 2200011

но я хочу, чтобы это было

  • если 0 и 0 пытаются добавить вместе, покажите 1
  • если попытаться добавить 1 и 0 вместе, покажите 0
  • если 0 и 1 попытались добавить вместе, покажите 0
  • если попытаться добавить 1 и 1 вместе, покажите 0

Что я хочу сделать, это a + b = 10011100

Есть ли способ отредактировать способ вычисления математики в этом случае?

далеко я дал заданные значения для представления букв, но я хочу изменить способ, которым питон дает мне результаты, чтобы они соответствовали гейту XOR в объяснении выше

так может кто-нибудь привести пример кода, чтобы дать установленные значения (1+1=0)(0+0=1) ... например

2 ответа

Вы сказали:

То, что я хочу сделать, это + B = 10011100

Мое решение:

>>> a=0b01100001
>>> b=0b01100010

>>> bin((a | b) ^ 0b11111111)
'0b10011100'

А теперь для объяснения:

Вы запрашиваете битовую операцию NOR ( http://en.wikipedia.org/wiki/NOR_gate если это не очевидно):

r = not (a or b)

Кроме того, вы можете использовать закон Де Моргана, который гласит:

r = (not a) and (not b)

В Python:

>>> bin((a ^ 0b11111111) & (b ^ 0b11111111))
'0b10011100'

Вы также можете спросить, что это ^ 0b11111111, Что ж, not a эквивалентно a xor 1 а также xor написано ^ в питоне. Я бы посоветовал вам записать логическую таблицу, если вы не уверены на 100%. В общем, ^ 0b11111111 изменяет 0 на 1 и 1 на 0.

bin Функция дает двоичное представление числа, указанного в качестве параметра. 0b в начале числа означает, что число дается в базе 2 (в противном случае это база 10).

Редактировать:

Первоначально, моя первая мысль для этой проблемы была:

bin(~(a|b))

Но результат '-0b1100100', Это потому, что в Python число подписано. Но также возможно получить хороший результат, сохранив только первый байт:

>>> bin(~(a|b) & 0xff)
'0b10011100'

Изменить 2:

Я только что обнаружил, что ОП задал еще один вопрос, чтобы лучше понять мой ответ. Итак, если вы удивляетесь, почему я использовал XOR для НЕ, см. Хорошее объяснение здесь: /questions/13063919/kak-sdelat-bitovyie-nor-vorota/13063930#13063930

Вы дали нам "таблицу истинности" всех возможных входных данных (спасибо за это). И вы говорите, что выход должен быть 1, если оба входа равны 0, в противном случае выход должен быть 0. Имя этой логической операции - NOR, то есть отрицание ИЛИ.

Обратите внимание, что ваши входные данные представляют собой числа 10, но они, как представляется, представляют собой числа 2 или наборы битов. Поэтому, возможно, первое, что мы должны сделать, - это преобразовать их из формы 10 в основу 2. Простой (но не слишком эффективный) способ будет int(str(a), 2),

Оттуда, это просто вопрос выполнения операции NOR для чисел. Отсюда: https://wiki.python.org/moin/BitwiseOperators похоже, что вы можете сделать ~(x|y) (отрицательное ИЛИ, побитовое).

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