回 帖 发 新 帖 刷新版面

主题:请教一下位操作的问题

题目如下
编写一个函数,该函数将一个unsigned int中的所有位向左旋转指定数量的位。例如,rotate_l(x,4)将x中的所有位向左移动4个位置,而且从左端丢失的位会重新出现在右端。也就是说,把从高位移出的位放入低位。在程序中测试该函数.
我想问一下,红色字部分是用来干什么的,它的原理是什么(即算法),有没有什么公式.

#include 

int rotate_l(unsigned int number, unsigned int bit);

int main(void)
{
unsigned int number, bit;
printf("input a hexadecimal number and rotated bits number (q to quit):");
while( scanf("%x%d", &number, &bit) == 2 )
{
  printf("%x rotate %d bit left : %x\n",  number, bit, rotate_l(number, bit));
  printf("input a number(q to quit):");
}
printf("quit\n");

return 0;
}

int rotate_l(unsigned int number, unsigned int bit)
{
unsigned int i;
unsigned int hign = 8 * sizeof(unsigned int);//最高位
for (i=0; i<BIT; I++)
  [color=FF0000]if( number&( 1<<(hign-1) ) ) number = (number << 1) | 1; 
 else number = number << 1;return number;[/color]
}

回复列表 (共1个回复)

沙发

判断最左边一位是不是1,如果是,则 number左移一位,右边补充1
如果不是,则 number左移一位,右边补充0

如果是我的话,我会这么写:
unsigned int rotate_l( unsigned int x, unsigned int n )
{
    return (x<<n)|(x>>(8*sizeof(x)-n));
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册