【发布时间】:2018-12-02 05:08:15
【问题描述】:
我需要使用 C 将 unsigned char 数组左旋转 1。我在互联网上发现了以下代码,我很难理解。我从没想过它会这么复杂(至少对我来说是这样)。有人可以帮我理解这里的代码到底发生了什么吗?
/* 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_BIT是 8,所以1<<(CHAR_BIT - 1)与1<<7相同,即0x80。换句话说,它是unsigned char的最高有效位的位掩码。 -
by: 向左旋转1个位置,你的意思是旋转一位还是一个数组项?
标签: c arrays rotation bit-manipulation unsigned