题目描述
编写一个函数,实现左右循环移位。函数名为move,调用方法为move(value, n)。其中value为需要循环位移的数,n为位移的位数。n<0表示为左移;n>0表示为右移。例如,n=4表示右移4位;n=-3表示左移3位。
请务必注意本题中的整数是32位无符号整数,输入和输出时可以使用%u进行处理。
输入
两个用空格隔开的整数,第一个为32位无符号整数value,第二个为整数n。保证n的绝对值不超过30。
输出
move(value, n)函数的返回结果。
请注意行尾输出换行
思路
- 这个函数分为两个部分,一个是n大于0的情况,一个是n小于0的情况
- n > 0时,向右循环移位,这个与题目1773是重复的,就不赘述了
- n < 0时,向左循环移位,即每移动一次,最高位被移到最低位。我们通过将value右移31位获取最高位,当最高位为1时,已经扩大了两倍的value与0x00000001进行或操作,把最低位替换成1
代码
#include<stdio.h>
#include<math.h>
unsigned int move(unsigned int, int);
int main()
{
unsigned int value;
int n;
scanf("%u %d", &value, &n);
printf("%u", move(value, n));
return 0;
}
unsigned int move(unsigned int value, int n)
{
int i, j;
if(n > 0)
{
for(i = 0; i < n; i++)
{
j = value % 2;
value /= 2;
if(j == 1)
{
value |= 0x80000000;
}
}
}
if(n < 0)
{
for(i = 0; i > n; i--)
{
j = value >> 31;
value *= 2;
if(j == 1)
{
value |= 0x00000001;
}
}
}
return value;
}