Подписанный эквивалент шестнадцатеричного значения дополнения 2

На терминале python, когда я это делаю: –

In [6]: 0xffffff85 Out[6]: 4294967173 In [9]: "%d" %(0xffffff85) Out[9]: '4294967173' 

Я хотел бы иметь возможность дать в 0xffffff85 и получить подписанное эквивалентное десятичное число в python (в данном случае -123 ). Как я мог это сделать?

В C я мог бы сделать это как: –

 int main() { int x = 0xffffff85; printf("%d\n", x); } 

Вы можете сделать это, используя библиотеку ctypes .

 >>> import ctypes >>> ctypes.c_int32(0xffffff85).value -123 

Вы также можете сделать то же самое с помощью библиотеки bitstring .

 >>> from bitstring import BitArray >>> BitArray(uint = 0xffffff85, length = 32).int -123L 

Без внешних / внутренних библиотек вы могли бы сделать:

 int_size = 32 a = 0xffffff85 a = (a ^ int('1'*a.bit_length())) + 1 if a.bit_length() == int_size else a 

Это занимает дополнение 2 к числу a , если bit_length() числа a равен вашему значению int_size . Значение int_size – это то, что вы берете как максимальную длину бита вашего двоичного числа с подписью [здесь a ].

Предполагая, что число подписано, отрицательное число бита int_size будет иметь свой первый бит (бит знака), установленный в 1. Следовательно, bit_length будет равен int_size .

Interesting Posts