сдвиг бита python3 более 64 раз

#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-int

3. Итак, вы нашли решение?

4. @DanielHao в моем imap коде code=(1<<int(k))^(1<<int(l)) решает проблему