numba的逻辑右移

时间:2016-07-20 16:53:39

标签: bit-shift unsigned-integer 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会导致逻辑转换。

1 个答案:

答案 0 :(得分:1)

我使用Numba 0.27从纯python和numba jitted版本得到相同的答案:

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?