Как получить логический двоичный сдвиг в python
Как видно из названия. В JavaScript есть конкретный оператор " → > ". Например, в JavaScript мы будем иметь следующий результат:
(- 1000) → > 3 = 536870787
(- 1000) → 3 = -125
1000 → > 3 = 125
1000 → 3 = 125
Итак, существует определенный метод или оператор, представляющий это " → > "?
Ответы
Ответ 1
Для этого нет встроенного оператора, но вы можете легко имитировать >>>
самостоятельно:
>>> def rshift(val, n): return val>>n if val >= 0 else (val+0x100000000)>>n
...
>>> rshift(-1000, 3)
536870787
>>> rshift(1000, 3)
125
Следующая альтернативная реализация устраняет необходимость в if
:
>>> def rshift(val, n): return (val % 0x100000000) >> n
Ответ 2
Нет, нет. Правый сдвиг в python является арифметическим.
Ответ 3
Numpy предоставляет функцию right_shift()
что делает это:
>>> import numpy
>>> numpy.right_shift(1000, 3)
125
Ответ 4
Вы можете выполнить побитовое смещение с нулями с помощью bitstring с помощью → =:
>>> a = BitArray(int=-1000, length=32)
>>> a.int
-1000
>>> a >>= 3
>>> a.int
536870787
Ответ 5
Попытка перевернуть знак знака отрицательного числа, маскируя его 0x100000000, в корне неверно понятна, поскольку она делает жесткие предположения относительно длины слова. В свое время в качестве программиста я работал с 24-, 48-, 16-, 18-, 32-, 36- и 64-разрядными номерами. Я также слышал о машинах, которые работают на нечетных длинах, таких как 37 и другие, которые используют одно-дополнение, а не twos-дополнение, арифметику. Любые предположения, которые вы делаете о внутреннем представлении чисел, помимо того, что они являются двоичными, опасны.
Даже двоичное предположение не является абсолютно безопасным, но я думаю, что мы это допустим.:)
Ответ 6
Здесь есть ссылка aix answer. Нормальный оператор с правом сдвига будет работать, если вы положите его положительное значение, поэтому вы действительно ищете конверсию из подписанного без знака.
def unsigned32(signed):
return signed % 0x100000000
>>> unsigned32(-1000) >> 3
536870787L
Ответ 7
Вам нужно помнить, что если число отрицательное, верхний бит установлен и при каждом сдвиге вправо вам нужно также установить верхний бит.
Вот моя реализация:
def rshift(val, n):
s = val & 0x80000000
for i in range(0,n):
val >>= 1
val |= s
return val
Ответ 8
Решение, которое работает без модуля:
>>> def rshift(val,n): return (val>>n) & (0x7fffffff>>(n-1))
Это работает, так как 7fffffff - положительное число и смещение вправо, которое добавит нули влево.