【问题标题】:Explanation of rotate left in CC中向左旋转的解释
【发布时间】: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 &gt;&gt; 30 为零。选择一个高位数字或将 0x1011 旋转 30 位。
  • 好的,所以如果 1011 存储在 4 位,而不是 32 位,我将它向左移动 2,我会得到 1110?
  • 是的,4 位数字 1011 会变成 1110。想象你的二进制数是循环的。旋转只是改变起点,而不是位模式。

标签: c rotation bit-manipulation bit shift


【解决方案1】:

这是 8 位“左移”和“左旋转”的图形定义:

"Why do I have to perform the OR operator here?" 
"And what does the right part actually do?"

对于“向左旋转”操作,“脱落”左侧的位被回收,因为它们被“或”回右侧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 2018-12-02
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多