К сожалению, нет встроенной функции для приведения целого числа без знака к значению со знаком, дополняющим два, но мы можем определить функцию для этого, используя побитовые операции:
def s12(value):
return -(value & 0b100000000000) | (value & 0b011111111111)
Первая побитовая операция - и используется для расширения знака отрицательных чисел (старший значащий бит установлен), в то время как вторая используется для захвата оставшихся 11 битов. Это работает, поскольку целые числа в Python рассматриваются как значения дополнения до произвольной точности 2.
Затем вы можете объединить это с функцией int
, чтобы преобразовать строку двоичных цифр в целое число без знака, а затем интерпретировать ее как 12-разрядное значение со знаком.
>>> s12(int('111111111111', 2))
-1
>>> s12(int('011111111111', 2))
2047
>>> s12(int('100000000000', 2))
-2048
Одним приятным свойством этой функции является то, что она идемпотентна, поэтому значение уже подписанного значения не изменится.
>>> s12(-1)
-1