无符号整数-numba中的逻辑右移



以下代码

@jit(uint32(uint32))
def foo(x): 
    return (x >> 6)
print(hex(foo(0xffffffff)))

输出

0xffffffff

因为numba使用算术右移,尽管操作数被定义为无符号。

有什么方法可以用逻辑移位来传达它吗?

事实上,从JoshAdel下面的回答中,我学到了一个变通方法——使用一个内部64位变量,逻辑和算术移位不会有什么不同。像这样:

@jit(uint32(uint32), locals = {'t': uint64})
def foo1(x):
    t = x 
    return t << 8
@jit(uint32(uint32), locals = {'t': uint64})
def foo2(x):
    t = x 
    return t >> 8
print(hex(foo1(0xffffffff)))
print(hex(foo2(0xffffffff)))

它打印

0xffffff00
0xffffff

但一个优秀的编译器应该明白,应用于unsigned数字的>>会导致逻辑移位。

我从使用numba 0.27:的纯python和numba jited版本中得到了相同的答案

import numba as nb
def foo(x): 
    return (x >> 6)
foo_nb = nb.jit()(foo)
print(hex(foo(0xffffffff)))
print(hex(foo_nb(0xffffffff)))

结果在:

0x3ffffff
0x3ffffff

以下也产生了相同的结果(以确保我们不会回到对象模式并实际使用完整的jit):

foo_nb2 = nb.jit('uint(uint)', nopython=True)(foo)
print(hex(foo_nb2(0xffffffff)))
# prints 0x3ffffff

你使用的是哪个版本的Numba?

最新更新