了解 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?
我们这样做是为了完成旋转,使移位循环。
我需要使用 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]
ini!=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?
我们这样做是为了完成旋转,使移位循环。