了解 C 中的 unsigned char 左旋转

Understanding unsigned char left rotation in C

我需要使用 C 将 unsigned char 数组左旋转 1。我在 Internet 上找到了以下代码,我很难理解。我从没想过它会如此复杂(至少对我来说是这样)。有人可以帮我准确理解这里的代码是怎么回事吗?

/* accept an unsigned char array, with size and rotate it left by one 1 position*/

static void rotate_left( unsigned char * input, int size)
{
    int i, carry_back= 0;

    if(input[size-1] & (1<<(CHAR_BIT - 1)))
    {
        carry_back = 1;
    }

    for(i= size-1; i>=0; i--)
    {
        unsigned char carry = 0;

        if(i!= 0 && (input[i-1] & (1<<(CHAR_BIT - 1))))
        {
            carry = 1;
        }
        input[i] <<= 1;
        input[i] |= carry;

    }

    if(carry_back == 1)
    {
        input[0] |= 0x01;
    }

}

此代码将无符号 char 大小 size 序列 向左循环一位,由 input 指针表示。顺序从后到前排列,如 little endian 系统。

为了做到这一点,您从序列的后面开始,向左移动,每次提取最高有效位进行移位,或 "carry",进入前面的 unsigned char .最高有效位的提取是使用以下公式完成的:input[i] & (1<<(CHAR_BIT - 1)) 这相当于使用按位 & 运算符通过 "masking" 检查该位。每个人 unsigned char 也向左移动,其最高有效位被删除。

作为最后一步,算法将最后一个 unsigned char 的最高有效位推入 carry_back 的最低有效位,从而完成旋转。

Why are we checking input[i-1] in i!=0 && (input[i-1] & (1<<CHAR_BIT -1)))?

因为序列的排列方式是位置i左边的下一个unsigned char位于位置i+1,所以i-1实际上是在位置 i.

的右侧

why are we doing an OR between input[i] and the carry at the end?

我们这样做是为了完成旋转,使移位循环。