Следующий код
@jit(uint32(uint32))
def foo(x):
return (x >> 6)
print(hex(foo(0xffffffff)))
выходы
0xffffffff
потому что numba
использует арифметический сдвиг вправо, несмотря на то, что операнд определен как беззнаковый.
Есть ли способ передать это, используя логический сдвиг?
На самом деле, из ответа ДжошаАделя ниже я узнал обходной путь - использование внутренней 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
, должно привести к логическому сдвигу.
x / (1 << 6)
и посмотреть, оптимизирует ли дрожание его до логического сдвига вправо. - person Andrew Morton   schedule 20.07.2016(1 << 6)
к беззнаковому типу (чтобы обе стороны деления были беззнаковыми) и проверить получившуюся сборку? Я предполагаю, что есть шанс, что если он увидитuint / uint
, он оптимизирует его, а неuint / int
. - person Andrew Morton   schedule 20.07.2016