de code suivantlogique de décalage à droite dans numba
@jit(uint32(uint32))
def foo(x):
return (x >> 6)
print(hex(foo(0xffffffff)))
sorties
0xffffffff
parce numba
utilise décalage droit arithmétique malgré le fait que l'opérande est définie comme étant non signé.
Y a-t-il un moyen de le transmettre pour utiliser le décalage logique? En fait, à partir de la réponse de JoshAdel ci-dessous, j'ai appris une solution de contournement - en utilisant une variable interne de 64 bits pour laquelle les décalages logiques et arithmétiques ne différeront pas. Comme ceci:
@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)))
qui imprime
0xffffff00
0xffffff
Mais un compilateur décent doit comprendre que >>
appliqué à un nombre unsigned
entraînera un changement logique.
Si la réponse de JoshAdel ne vous conduit pas à une solution, vous pouvez essayer 'x/(1 << 6)' à la place et voir si la gigue l'optimise pour un décalage logique vers la droite. –
L'ai essayé. La division reste dans l'assemblée. Dommage. –
Pouvez-vous contraindre '(1 << 6)' à un type non signé (de sorte que les deux côtés de la division ne soient pas signés) et vérifier l'assemblage résultant? Je suggère qu'il y a une chance que s'il voit 'uint/uint' il l'optimisera, par opposition à' uint/int'. –