右移的实现是:
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
最佳答案
这是在 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));
}
关于C 数循环移位错误答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20744066/