【发布时间】:2016-07-20 16:53:38
【问题描述】:
以下代码
@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 数字会导致逻辑移位。
【问题讨论】:
-
如果 JoshAdel 的回答没有让您找到解决方案,您可以尝试
x / (1 << 6)并查看抖动是否将其优化为逻辑右移。 -
试过了。该部门仍在议会中。太糟糕了。
-
你能将
(1 << 6)强制转换为无符号类型(这样除法的两边都是无符号的)并检查生成的程序集吗?我建议如果它看到uint / uint,它有可能会优化它,而不是uint / int。
标签: bit-shift unsigned-integer numba