题目描述
编写一个函数,实现左右循环移位。函数名为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)函数的返回结果。
请注意行尾输出换行。
样例输入
128 -3
样例输出
1024
方案一:
#include<stdio.h>
unsigned int move(unsigned int value,int n);
int main(){
unsigned int value,n;
scanf("%u%d",&value,&n);
printf("%u\n",move(value,n));
return 0;
}
unsigned int move(unsigned int value,int n){
return (value>>n)|(value<<(32-n)); //左右循环位移
}
方案二:
#include <stdio.h>
unsigned int move(unsigned int value, int n) {
unsigned int mask = (1 << 32) - 1; // 用于截取32位无符号整数的掩码
if (n > 0) {
// 右移n位,左边的n位移到右边
value = (value >> n) | (value << (32 - n));
} else if (n < 0) {
// 左移-n位,右边的-n位移到左边
n = -n;
value = (value << n) | (value >> (32 - n));
}
// 截取32位无符号整数
return value & mask;
}
int main() {
unsigned int value,n;
scanf("%u%d", &value, &n);
value = move(value, n);
printf("%u\n", value);
return 0;
}