2011-04-29 35 views
22

正如標題所示。在JavaScript中有一個特定的運算符'>>>'。例如,在JavaScript中,我們將有如下結果:如何在python中獲得邏輯正確的二進制移位

(-1000)>>> 3 = 536870787

(-1000)>> 3 = -125

1000 >>> 3 = 125

1000 >> 3 = 125

那麼,有一定的方法或操作者表示該 '>>>'?

回答

28

沒有這個內置的運營商,但你可以很容易地模擬>>>自己:

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

'(val + 0x100000000)%0x100000000)'是'val%0x100000000'。 – 2011-04-29 19:16:24

+1

@Baffe Boyois:在Python中它肯定不是(結果總是正的,而第一個操作數可以有符號)。 – NPE 2011-04-29 19:57:57

+2

例子?請注意,Python中的「-1%3 == 2」。 [「模運算符總是產生與第二個操作數(或零)相同符號的結果」](http://docs.python.org/reference/expressions.html#binary-arithmetic-operations) – 2011-04-29 21:39:57

6

不,沒有。 python的右移是算術運算。

+0

因此,這是包括在一些包裝呢? – dementrock 2011-04-29 14:03:42

+0

我沒有意識到。 – Femaref 2011-04-29 14:05:21

+0

由於Python沒有無符號數字,它只有意義,它不會包含無符號的移位。 – 2012-07-10 17:06:32

3

Numpy提供了right_shift()這樣做的功能:

>>> import numpy 
>>> numpy.right_shift(1000, 3) 
125 
+3

但是,那不就是'>>'運算符嗎?如果我嘗試'numpy.right_shift(-1000,3)'我得到'-125'而不是'536870787'。 – 2011-04-29 18:11:53

+0

好吧,我會被詛咒! – jathanism 2011-04-29 18:29:30

2

你可以做一個按位移位填充用的>>=運營商與bitstring模塊零:

>>> a = BitArray(int=-1000, length=32) 
>>> a.int 
-1000 
>>> a >>= 3 
>>> a.int 
536870787 
+0

旋轉與換檔不一樣。 – 2012-07-10 17:05:34

+0

@Mark:公平點 - 我誤解了>>>操作符在做什麼。現在修復。 – 2012-07-10 19:25:34

1

這裏是aix's answer分拆。如果你給它一個正值,正常的右移運算符將工作,所以你真的在尋找從signed到unsigned的轉換。

def unsigned32(signed): 
    return signed % 0x100000000 

>>> unsigned32(-1000) >> 3 
536870787L 
1

試圖通過用0x100000000掩蔽它翻轉負數的符號位是從根本上誤解,因爲它使有關的字長硬假設。在我作爲程序員的時候,我曾與24位,48位,16位,18位,32位,36位和64位的數字合作。我也聽說過奇數長度的機器,例如37和其他使用補碼的機器,而不是二進制補碼算術。關於數字內部表示的任何假設都是危險的,除了它們是二元的以外。

即使二元假設也不是絕對安全的,但我認爲我們會允許的。 :)

1

你需要記住,如果數字是負數,最高位被設置,並且每次右移都需要設置最高位。

這是我實現:

def rshift(val, n): 
    s = val & 0x80000000 
    for i in range(0,n): 
     val >>= 1 
     val |= s 
    return val