C循环移位的错误答案

时间:2013-12-23 12:55:12

标签: c bit-manipulation shift

正确转变的实施是:

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

但如果值为0x17=00010111,则结果应为0x8b=10001011,但结果为0x8000000b

如何处理这个问题?

#include <stdio.h>
unsigned int rotr(unsigned int value,int shift) {
    return (value >> shift) | (value << (sizeof(value) * 8 - shift));
}
int main()
{
  unsigned int a = 0x17;
  printf("%x",rotr(a,(unsigned)1));
}

=> 8000000b

1 个答案:

答案 0 :(得分:5)

这是在32位整数中旋转0x17的正确结果:从

开始
00000000 00000000 00000000 00010111

你最终得到了

10000000 00000000 00000000 00001011

如果您想轮换一个8位数字,请使用uint8_t代替int作为函数参数:

uint8_t rotr(uint8_t value, int shift) {
    // No need to multiply by sizeof(value), because the type uint8_t forces it to be 1
    return (value >> shift) | (value << 8 - shift));
}