c中的左旋转算法二进制值

left Rotate algorithm binary value in c

我正在尝试左旋转二进制值:

int left_side=0;
    for (int i = 0; i < n; i++)
    {         
        left_side = left_side | (  ( number & ( 1<<BITS-i )) >> (BITS+i+1)-n  );

    }

BITS表示二进制值的长度,n为旋转的距离。
示例: 1000 和 n=1 这意味着解决方案将是: 0001.

我在旋转它(从左到右)时不明白的一些原因,让我们以二进制序列为 11111101 和 n=3(距离)的数字 253 为例,这是我的结果二进制序列中的代码是 101(即 5)。
为什么答案不是 7?我在这个循环中错过了什么? 谢谢

您想向左旋转您的 n 个特定 amount 位。

因此,您必须使用 n << amount 将数字向左移动,并将左边的位放在右边。这是通过使用右移将位 [0-amount[ 放入 [NUMBER_BITS-amount,NUMBER_BITS[` 来完成的。

例如,如果您的号码是 uint32_t,您可以使用以下代码(或轻松地将其改编为其他类型)。

uint32_t RotateLeft(uint32_t n, int amount)  { 
    return (n << amount)|(n >> (8*sizeof(uint32_t) - amount)); 
}

我认为有两种方法:

  1. 循环1位n
  2. 只旋转 n % BITS 位一次

旋转“结束”,因此我们可以将 n 的每个 BITSth(第 8)倍数取模为 0,以防有人想要旋转 100 次。我认为第二种方法更容易理解、实施和阅读,如果可以一次完成,为什么要循环 100 次?

算法:

我将使用 8 位进行演示,尽管 int is minimum 16 bits。原来的MSB用点标记。

.11110000 rl 2 == 110000.11

发生什么事了? 2 位向右,其余 (BITS - 2) 向左。那只是左移和右移“组合”。

a = .11110000 << 2 == 110000.00
b = .11110000 >> (BITS - 2) == 000000.11
c = a | b
c == 110000.11

很简单,不是吗?请记住首先使用 n % BITS 并使用 unsigned 类型。

unsigned int rotateLeft(unsigned int number, int n) {
    n %= BITS;
    unsigned int left = number << n;
    unsigned int right = number >> (BITS - n);
    return left | right;
}