通用循环按位移位行为

时间:2015-07-05 08:10:27

标签: c bit-manipulation bit-shift

这里有关于循环按位移位行为的一系列问题;然而,即使经过它们,我也不认为下面的陈述是由任何人提出的,我对此感到困惑。

来自维基百科的Circular Shift声明:

/*
 * Shift operations in C are only defined for shift values which are
 * not negative and smaller than sizeof(value) * CHAR_BIT.
 */

unsigned int rotl(unsigned int value, int shift) {
    return (value << shift) | (value >> (sizeof(value) * CHAR_BIT - shift));
}

unsigned int rotr(unsigned int value, int shift) {
    return (value >> shift) | (value << (sizeof(value) * CHAR_BIT - shift));
}

我对上述行的解释是 - 在上面提到的两种移位行为条件是不确定的。

但是我看到了给出的例子

rotl(0x8000, -1),回答为0x00010000

rotl(8,-1),回答为16

处理这种移位参数的正确方法是什么(即负数和大于比特数)?我误解了什么吗?

1 个答案:

答案 0 :(得分:1)

#define CHAR_BITS  ( 8 )
#define UINT_BITS  ( sizeof(unsigned int) * CHAR_BITS )

// We need modulo, not remainder. This is a way to obtain it.
int mod(int x, int m) {
    return ((x % m) + m) % m;
}

// Calculate left rotation for any shift value.
unsigned int rotl(unsigned int value, int shift) {
    int lshift = mod(shift, UINT_BITS);
    return (value << lshift) | (value >> (UINT_BITS - lshift));
}