正如標題所示。在JavaScript中有一個特定的運算符'>>>'。例如,在JavaScript中,我們將有如下結果:如何在python中獲得邏輯正確的二進制移位
(-1000)>>> 3 = 536870787
(-1000)>> 3 = -125
1000 >>> 3 = 125
1000 >> 3 = 125
那麼,有一定的方法或操作者表示該 '>>>'?
正如標題所示。在JavaScript中有一個特定的運算符'>>>'。例如,在JavaScript中,我們將有如下結果:如何在python中獲得邏輯正確的二進制移位
(-1000)>>> 3 = 536870787
(-1000)>> 3 = -125
1000 >>> 3 = 125
1000 >> 3 = 125
那麼,有一定的方法或操作者表示該 '>>>'?
沒有這個內置的運營商,但你可以很容易地模擬>>>
自己:
>>> 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
不,沒有。 python的右移是算術運算。
因此,這是包括在一些包裝呢? – dementrock 2011-04-29 14:03:42
我沒有意識到。 – Femaref 2011-04-29 14:05:21
由於Python沒有無符號數字,它只有意義,它不會包含無符號的移位。 – 2012-07-10 17:06:32
Numpy提供了right_shift()
這樣做的功能:
>>> import numpy
>>> numpy.right_shift(1000, 3)
125
但是,那不就是'>>'運算符嗎?如果我嘗試'numpy.right_shift(-1000,3)'我得到'-125'而不是'536870787'。 – 2011-04-29 18:11:53
好吧,我會被詛咒! – jathanism 2011-04-29 18:29:30
這裏是aix's answer分拆。如果你給它一個正值,正常的右移運算符將工作,所以你真的在尋找從signed到unsigned的轉換。
def unsigned32(signed):
return signed % 0x100000000
>>> unsigned32(-1000) >> 3
536870787L
試圖通過用0x100000000掩蔽它翻轉負數的符號位是從根本上誤解,因爲它使有關的字長硬假設。在我作爲程序員的時候,我曾與24位,48位,16位,18位,32位,36位和64位的數字合作。我也聽說過奇數長度的機器,例如37和其他使用補碼的機器,而不是二進制補碼算術。關於數字內部表示的任何假設都是危險的,除了它們是二元的以外。
即使二元假設也不是絕對安全的,但我認爲我們會允許的。 :)
你需要記住,如果數字是負數,最高位被設置,並且每次右移都需要設置最高位。
這是我實現:
def rshift(val, n):
s = val & 0x80000000
for i in range(0,n):
val >>= 1
val |= s
return val
'(val + 0x100000000)%0x100000000)'是'val%0x100000000'。 – 2011-04-29 19:16:24
@Baffe Boyois:在Python中它肯定不是(結果總是正的,而第一個操作數可以有符號)。 – NPE 2011-04-29 19:57:57
例子?請注意,Python中的「-1%3 == 2」。 [「模運算符總是產生與第二個操作數(或零)相同符號的結果」](http://docs.python.org/reference/expressions.html#binary-arithmetic-operations) – 2011-04-29 21:39:57