Как выполнить побитовое Не работает в Python?
Чтобы проверить построение операции Xor с более базовыми строительными блоками (используя Nand, Or и And And in my case), я должен иметь возможность выполнить операцию "Нет". Похоже, что встроенный not
делает это с одиночными битами. Если я это сделаю:
x = 0b1100
x = not x
Я должен получить 0b0011
, но вместо этого я просто получаю 0b0
. Что я делаю не так? Или Python просто не хватает этой базовой функции?
Я знаю, что у Python есть встроенная функция Xor, но я использовал Python для проверки вещей для проекта/курса HDL, где мне нужно построить Xor-gate. Я хотел протестировать это в Python, но я не могу без эквивалента Not gate.
Ответы
Ответ 1
Проблема с использованием ~
в Python заключается в том, что он работает со знаками целых чисел. Это также единственный способ, который действительно имеет смысл, если вы не ограничиваете себя определенным количеством бит. Он будет работать нормально с побитовой математикой, но это может затруднить интерпретацию промежуточных результатов.
Для 4-битной логики вы должны просто вычесть из 0b1111
0b1111 - 0b1100 # == 0b0011
Для 8-разрядной логики вычитайте из 0b11111111
и т.д.
Общий вид
def bit_not(n, numbits=8):
return (1 << numbits) - 1 - n
Ответ 2
Попробуйте это, он назвал побитовое дополнение operator:
~0b1100
Ответ 3
Другой способ добиться этого - назначить маску, подобную этой (должно быть все 1):
mask = 0b1111
Затем скопируйте его со своим номером следующим образом:
number = 0b1100
mask = 0b1111
print(bin(number ^ mask))
Вы можете обратиться к таблице истинности xor, чтобы узнать, почему она работает.
Ответ 4
Общая форма, заданная Джоном Ла Руи, может быть упрощена таким образом (python == 2.7 и> = 3.1):
def bit_not(n):
return (1 << n.bit_length()) - 1 - n