如标题所示,在JavaScript中有一个特定的运算符>>>
。例如,在JavaScript中我们将得到以下结果:
(-1000) >>> 3 = 536870787
(-1000) >> 3 = -125
1000 >>> 3 = 125
1000 >> 3 = 125
那么是否有某种方法或运算符表示这个 >>>
?
如标题所示,在JavaScript中有一个特定的运算符>>>
。例如,在JavaScript中我们将得到以下结果:
(-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中没有逻辑右移运算符。Python中的右移运算符是算术右移。
def unsigned32(signed):
return signed % 0x100000000
>>> unsigned32(-1000) >> 3
536870787L
Numpy 提供了 right_shift()
函数来实现这个功能:
>>> import numpy
>>> numpy.right_shift(1000, 3)
125
>>
运算符吗?如果我尝试 numpy.right_shift(-1000, 3)
,我得到的是 -125
而不是 536870787
。 - Scott Griffithsnumpy.uint32(-1000) >> 3
。请注意,当我测试这个特定情况时,输出类型是numpy.int64
(有符号)。 - Inkling即使是二进制假设也并非绝对安全,但我认为我们可以接受。
这是我的实现:
def rshift(val, n):
s = val & 0x80000000
for i in range(0,n):
val >>= 1
val |= s
return val
你也可以使用地板除法:
def rshift(val, n):
if val > 0:
return val >> n
return val // -(2^n)
>>> def rshift(val,n): return (val>>n) & (0x7fffffff>>(n-1))
这个方法有效是因为7fffffff是一个正数,右移时会在左边添加零。这不是一种高效的方法,但它能够按预期工作。
def _toBinary(x):
x=int(x)
binary = []
while x > 0:
binary.append(str(x%2))
x=int(x/2)
return "".join(binary[::-1])
def _fromBinary(xs):
ans = 0
for i,x in enumerate(xs[::-1]):
if x == '1':
ans += 2**i
return ans
def leftLogicalShift(x,n=1):
if not type(x) == int:
return x
xs = _toBinary(x)
xs = [x for x in xs]
for _ in range(n):
xs.pop(0)
xs.append('0')
return _fromBinary("".join(xs))
def rightLogicalShift(x,n=1):
if not type(x) == int:
return x
xs = _toBinary(x)
xs = [x for x in xs]
for _ in range(n):
xs.pop()
xs.insert(0,'0')
return _fromBinary("".join(xs))
def leftArithmeticShift(x,n=1):
return leftLogicalShift(x,n)
def rightArithmeticShift(x,n=1):
if not type(x) == int:
return x
xs = _toBinary(x)
xs = [x for x in xs]
for _ in range(n):
tmp = xs[0]
xs.pop()
xs.insert(0,tmp)
return _fromBinary("".join(xs))
lls = leftLogicalShift(10,2)
print(lls) # 8
rls = rightLogicalShift(10,2)
print(rls) # 2
las = leftArithmeticShift(10,2)
print(las) # 8
ras = rightArithmeticShift(10,2)
print(ras) # 14
参考资料:
(val + 0x100000000) % 0x100000000)
等同于val % 0x100000000
。 - Baffe Boyois-1 % 3 == 2
。"模运算符始终生成一个与其第二个操作数(或零)具有相同符号的结果" - Baffe Boyois1 << 32
,其中的32是用于表示整数的位数(这一点很重要但没有明确说明)。如果你使用64位整数,则需要使用1 << 64
。 - Scott Griffithsval >>> 0
,它基本上会将其转换为无符号。打开您的浏览器控制台并自行尝试。 - Inkling