Я попытался повторить доклад Брэндона Роудса о 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 ?