Как выполнить побитовое Не работает в 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