2010-07-13 2 views
8

У меня есть отрицательное целое число (4 байта), из которого я хотел бы иметь шестнадцатеричную форму представления его двух дополнений.Как напечатать целое число со знаком как шестнадцатеричное число в дополнении к python?

>>> i = int("-312367") 
>>> "{0}".format(i) 
'-312367' 
>>> "{0:x}".format(i) 
'-4c42f' 

Но я хотел бы видеть "FF ..."

+1

ли это домашнее задание? – Konrad

+0

«шестнадцатеричная форма представления его двух дополнений»? Как это может быть полезно? – Konrad

+0

Конрад, возможно, он готовит инструмент, чтобы показать своим ученикам, как это делается. Или ему любопытно. Или у него есть API, чтобы следовать. Или собеседник поставил ему случай с пивом, что Perl мог бы сделать это лучше. – sarnold

ответ

5

Вот способ (для 16 битных чисел):

>>> x=-123 
>>> hex(((abs(x)^0xffff) + 1) & 0xffff) 
'0xff85' 

(Может быть не самый элегантный способ, хотя)

+0

Спасибо! (используйте abs (x)) – none

+1

Это не работает для положительных чисел. Если x = 1, вы получаете '0xffff' (-1 в дополнении 16-битного двоичного кода) вместо' 0x0001'. – dcoles

+0

@dcoles, OP сказал отрицательное целое число ... – adamk

3

Использование bitstring модуля:

>>> bitstring.BitArray('int:32=-312367').hex 
'0xfffb3bd1' 
4
>>> x = -123 
>>> bits = 16 
>>> hex((1 << bits) + x) 
'0xff85' 
>>> bits = 32 
>>> hex((1 << bits) + x) 
'0xffffff85' 
+0

Для 123, не является дополнением 16-разрядного 2-го представления 0x007b? 0xff85 будет для -123. – dcoles

+0

@dcoles, сумма 123 и его дополнение 2 должны быть 0 (бит переноса/переполнения отбрасывается). Неважно, хотите ли вы обрабатывать '0xff85' как подписанные или беззнаковые. –

+0

Я согласен с тем, что дополнение 2 (операция по двоичным числам) 0x007b равно 0xff85, но я считаю, что вопрос был о представлении числа дополнений, дополненном 2. – dcoles

0

Модуль struct выполняет преобразования между значениями Python и C -структурами, представленными как объекты байтов Python. Объект упакованных байтов предлагает доступ к отдельным байтовым значениям. Это может использоваться для отображения основного (C) целочисленного представления.

>>> packed = struct.pack('>i',i) # big-endian integer 
>>> type(packed) 
<class 'bytes'> 
>>> packed 
b'\xff\xfb;\xd1' 
>>> "%X%X%X%X" % tuple(packed) 
'FFFB3BD1' 
>>> 
1

Для лечения целое число в виде двоичного значения, то побитовое и с маской желаемой битовой длины.

Например, для значения 4 байта (32 бита), мы маска с 0xffffffff:

>>> format(-1 & 0xffffffff, "08X") 
'FFFFFFFF' 
>>> format(1 & 0xffffffff, "08X") 
'00000001' 
>>> format(123 & 0xffffffff, "08X") 
'0000007B' 
>>> format(-312367 & 0xffffffff, "08X") 
'FFFB3BD1' 
Смежные вопросы