Подтвердить что ты не робот

Как получить логический двоичный сдвиг в python

Как видно из названия. В JavaScript есть конкретный оператор " → > ". Например, в JavaScript мы будем иметь следующий результат:

(- 1000) → > 3 = 536870787

(- 1000) → 3 = -125

1000 → > 3 = 125

1000 → 3 = 125

Итак, существует определенный метод или оператор, представляющий это " → > "?

4b9b3361

Ответ 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 - положительное число и смещение вправо, которое добавит нули влево.