【发布时间】:2021-03-03 15:14:18
【问题描述】:
我试图用 C++ 编写一些关于“按位旋转”的代码,我想通过左移来实现。我不知道如何编码,但我在“维基百科”中找到了这样的小代码。
unsigned int rotl(unsigned int value, int shift) {
return (value << shift) | (value >> (sizeof(value) * CHAR_BIT - shift));
}
然后我试图让它工作,但是这段代码没有给出我期望的输出。前任。我有数字unsigned int 12,二进制1100,当我想用上面的代码按左移位按位旋转时,输出是和unsigned int 24,(11000),它必须给出输出@987654324 @,因为如果我进行按位旋转(左移),第一个 MSB 位现在必须是第一位,所有其他位都必须向左移动一位。
你能帮助理解这是什么问题吗?或者我做错了什么。
谢谢。
【问题讨论】:
-
所以你的值是 4 位宽?您显示的代码适用于
unsigned int类型的值,它远远超过 4 位。 -
你的函数是正确的。整数有 32 位,而不是 4。
-
@GregHewgill 您在谈论“经典旋转移位”,但 OP 要求不同的东西。这可能是误解了“循环转变”的含义。
-
你对 CHAR_BIT 的定义是什么,我用 8 测试它,它输出 24
-
函数看起来没问题,实现了循环移位(通常理解)。 IE。如果将数字移 1,则位
31将转到位置0,而不管其值如何。您在示例中所期望和说明的内容完全不同。
标签: c++ bit-manipulation