【发布时间】:2014-05-01 16:14:41
【问题描述】:
我需要帮助来理解 C 语言。我刚出道。 我有这段来自维基百科的代码:
unsigned int rotl(unsigned int value, int shift) {
return (value << shift) | (value >> (sizeof(value) * CHAR_BIT - shift));
}
我确实理解位旋转的含义。我只是不明白这个实现。 为什么我必须在这里执行 OR 运算符?正确的部分实际上是做什么的?
我将值向右移动值的字节数乘以(char 变量中的位数减去我想要的移位)。为什么我必须这样做? 如果我想到一个例子。 我想将 unsigned 1011 (Base 2) 2 位向左移动。 我按照代码所说的去做:
0000 0000 0000 0000 0000 0000 0000 1011
1011 >> (4*(8-2))=24 = 0000 0000 0000 0000 0000 0000 0000 0000 0000;
执行 |: = 0000 0000 0000 0000 0000 0000 0010 1100。
好吧,那没用。我做错了什么?
谢谢!
【问题讨论】:
-
括号打错了:
4 * (8 - 2)应该是4*8 - 2。另外,为什么这不起作用?你的结果是正确的。正确的转变对您的运营没有任何帮助。 -
但我想向左旋转,而不是向左移动。不应该是 1011 leftrot(2) = 1110 吗?还是我把旋转的概念弄错了,只有当旋转像 1000 0000 0000 0000 1001 0000 1010 1100 这样的东西时才会发生这种情况?
-
但是你这样做!移位意味着位在左端被推出。旋转意味着它们重新出现在右侧。您的示例没有任何可能出现的高位,
0x1011 >> 30为零。选择一个高位数字或将0x1011旋转 30 位。 -
好的,所以如果 1011 存储在 4 位,而不是 32 位,我将它向左移动 2,我会得到 1110?
-
是的,4 位数字 1011 会变成 1110。想象你的二进制数是循环的。旋转只是改变起点,而不是位模式。
标签: c rotation bit-manipulation bit shift