#python-3.x #mapping #bit-manipulation #long-integer
Вопрос:
У меня возникли проблемы с созданием функции, которая может перемещать немного больше 64 сайтов.
Я создаю функцию отображения и обратного отображения в массиве table
. Я table
заполняю его числами, имеющими только два 1 бита в порядке возрастания. Функция сопоставления map(number)
возвращает позиции двух битов в table[number]
. Функция обратного отображения imap(k,l)
работает так, как она создает число с двумя битами на k
и l
сайте. И он возвращает индекс, в котором указано число table
.
Например, я генерирую table
как
idx number(binary)
0 11
1 101
2 110
3 1001
... ...
Если я использую map(3)
, он вернется (3,0)
Если я использую imap(3,0)
, он вернется 3
Вот в чем проблема: если я использую imap(63,0)
, он не может найти соответствующий номер, table
даже если table
содержит номер. Мой код выглядит так
def imap(k,l):
code=(1<<k)^(1<<l)
from bisect import bisect_left
idx=bisect_left(table,code)
if idx!=len(table) and table[idx]==code:
return idx
raise valueError
И я обнаружил, что code=(1<<k)^(1<<l)
эта часть бросает -111111111111111111111111111111111111111111111111111111111111111
в мой код.
Я тестирую (1<<63)^(1<<0)
в python3 в режиме ожидания, он возвращается
>>> format((1<<63)^(1<<0),'b')
'1000000000000000000000000000000000000000000000000000000000000001'
Почему они показывают другой результат?
Комментарии:
1. Не может размножаться. Когда я добавляю
print(format(code, "b"))
строку в вашу функцию, она выводит правильное значение, а не отрицательное.2. @Selcuk Спасибо за проверку. Теперь я понимаю, что если я использую
k,l
массив numpy, то он выдает отрицательное значение. Затем я должен найти метод преобразования числа из массива numpy в число python-int3. Итак, вы нашли решение?
4. @DanielHao в моем
imap
кодеcode=(1<<int(k))^(1<<int(l))
решает проблему