【发布时间】:2014-11-27 17:38:03
【问题描述】:
我正在尝试将此 C 函数转换为 Python;
typedef unsigned long var;
/* Bit rotate rightwards */
var ror(var v,unsigned int bits) {
return (v>>bits)|(v<<(8*sizeof(var)-bits));
}
我已经尝试在谷歌上搜索一些解决方案,但我似乎无法让它们中的任何一个给出与此处相同的结果。
这是我从另一个程序中找到的一个解决方案;
def mask1(n):
"""Return a bitmask of length n (suitable for masking against an
int to coerce the size to a given length)
"""
if n >= 0:
return 2**n - 1
else:
return 0
def ror(n, rotations=1, width=8):
"""Return a given number of bitwise right rotations of an integer n,
for a given bit field width.
"""
rotations %= width
if rotations < 1:
return n
n &= mask1(width)
return (n >> rotations) | ((n << (8 * width - rotations)))
我正在尝试 btishift key = 0xf0f0f0f0f123456。 C代码在调用时给出000000000f0f0f12; ror(key, 8 << 1) 和 Python 给出; 0x0f0f0f0f0f123456(原始输入!)
【问题讨论】:
-
那你为什么要传入
8 << 1进行轮换呢?这比width大,所以你最终得到 0 次旋转(16 % 8是 0)。 -
循环最多 3 个。所以它将旋转为
8 << 0、8<<1、8<<2。 -
所有这些都大于
width并且是width的倍数,所以rotations %= width将永远是0。 -
我明白这一点。如果我更改
width,我得到的结果仍然无法与 C 输出相比较。 -
C 输出看起来像旋转了 16 位,掩码为 32 位。我完全不知道你为什么在这里使用
rotations %= width。