2015-09-04 3 views
0

Приведенное положительное целое число, такое как 171 и «регистр», например, 8.преобразовать целое число python в его двоичное представление, подписанное

Я хочу целое число, которое представлено двоичным представлением 171, то есть '0b10101011', интерпретируемым как дополнение к двум.

В данном случае 171 должен стать -85. Это отрицательное значение, поскольку заданный размер «регистра» 8, MSB равен 1.

Надеюсь, мне удалось объяснить мою проблему. Как я могу сделать это преобразование?

Что я пробовал:

size = 8 
value = 171 

b = bin(value) 

if b[len(b)-size] == '1': 
    print "signed" 
    # What to do next? 
+0

Могу ли я спросить, почему я был отвергнут? – stackoverflowwww

ответ

3

Вам не нужно бинарное преобразование, чтобы достичь этого:

>>> size = 8 
>>> value = 171 
>>> unsigned = value % 2**size 
>>> signed = unsigned - 2**size if unsigned >= 2**(size-1) else unsigned 
>>> signed 
-85 
2

Есть, вероятно, сотни различных способов сделать это. Вот пара.

Если размер кратен 8, то что-то, как это будет делать работу:

x = int.from_bytes(value.to_bytes(size // 8, byteorder='big'), byteorder='big', signed=True) 

Если размер не является кратным 8, то вы можете сделать что-то вроде этого:

mask = 1 << (size - 1) 
x = (value^mask) - mask 

Оба предполагают, что значение не слишком большое, чтобы вписаться в «регистр».

 Смежные вопросы

  • Нет связанных вопросов^_^