Как сделать побитовый 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)
(отрицательное ИЛИ, побитовое).