【发布时间】:2015-11-20 02:27:25
【问题描述】:
有没有一种简单的方法可以让左移和减法像在 C 中一样使用 Cython 处理无符号整数?
例如:
def left_shift(unsigned int x, unsigned int shift):
return x << shift
def main():
print left_shift(0xffffffff, 4)
print left_shift(0xffffffff, 8)
print left_shift(0xffffffff, 12)
我希望这会打印出相当于
的十进制数0xfffffff0
0xffffff00
0xfffff000
这就是我得到的。
4294967280
4294967040
4294963200
但是,如果我尝试做一些更精细的事情,例如在大输入上使用 Jenkins 的哈希函数之一,我会得到:
def hash_fcn1(unsigned int key):
key = (key ^ 0xdeadbeef) + (key << 4)
key = key ^ (key >> 10)
key = key + (key << 7)
key = key ^ (key >> 13)
return key
hash_fcn1(0xffffffff)
File "./hash_fcn_test.py", line 94, in <module>
main()
File "./hash_fcn_test.py", line 60, in main
print hash_fcn1(0xffffffff)
File "hash_fcns.pyx", line 6, in hash_fcns.hash_fcn1 (/home/medusa/.pyxbld/temp.linux-x86_64-2.7/pyrex/hash_fcns.c:854)
key = (key ^ 0xdeadbeef) + (key << 4)
**OverflowError: value too large to convert to unsigned int**
当计算值导致负数时,也会出现类似的问题。有没有办法解决这些问题?我希望计算的行为就像它在 C 中一样。这要求太多了吗?我在网上搜索了一下,似乎通常的做法是按位和 (&) 每个结果都使用 MAX_INT,但这是非常沉重的。 p>
我可以在 Cython 编译器或其他地方设置一个标志吗?
【问题讨论】:
标签: cython bitwise-operators bit-shift integer-arithmetic