Python `bin` отрицательные целые числа

Я попытался повторить доклад Брэндона Роудса о Pycon2010 Мощный словарь и заметил, что не могу используйте встроенный в python bin для вычисления младших значащих битов хэша:

>>> bin(hash("ftp"))[-3:]
'111'

Что, согласно разговору, должно быть 001.

Немного покопавшись, я обнаружил, что мне пришлось использовать эту пользовательскую функцию bits, например Brandon:

>>> def bits(integer):
       return "".join(str(x) for x in [1&(integer>>i) for i in range(32)[::-1]])

>>> bits(hash("ftp"))[-3:]
'001'

Видимо потому, что встроенная функция bin возвращает биты в виде двоичных строк со знаком:

>>> bits(-100)
'11111111111111111111111110011100'  # two-complement representation preceded by 1s
>>> bin(-100)
'-0b1100100'  # signed magnitude representation

Почему это так? Есть ли конкретная причина, по которой не возвращается представление с двумя дополнениями отрицательного целого числа в python ?


person Sebastian Wozny    schedule 19.11.2015    source источник


Ответы (1)


В Python целые числа имеют произвольную точность и не имеют фиксированного размера: представление -1 с дополнением до 2 потребует бесконечной последовательности 1s.

person 6502    schedule 19.11.2015