/* 编写一个移位函数,使移位函数既能循环左移又能循环右移。参数n大于0时便是左移,参数n小于0时便是右移 解释:循环右移:把右边移出的位放到左边移入的位 如: 1101 0101 1100 循环左移四位 0101 1100 1101 循环左移:把左边移出的位放到右边移入的位 思路:要得到 实现循环左移 左移4位 << 0110 0000 0000 0000 0000 0000 0000 1111 1) 0000 0000 0000 0000 0000 0000 1111 0000 右移28位 >> 0110 0000 0000 0000 0000 0000 0000 1111 2) 0000 0000 0000 0000 0000 0000 0000 0110
0000 0000 0000 0000 0000 0000 1111 0000 ^ 0000 0000 0000 0000 0000 0000 0000 0110 ------------------------------------------------------ 0000 0000 0000 0000 0000 0000 1111 0110 (异或:相同为0 不同为1)
实现循环右移
右移4位: 0110 0000 0000 0000 0000 0000 0000 1111 0000 0110 0000 0000 0000 0000 0000 0000 1111 左移28位: 0110 0000 0000 0000 0000 0000 0000 1111 1111 0000 0000 0000 0000 0000 0000 0000
0000 0110 0000 0000 0000 0000 0000 0000 ^ 1111 0000 0000 0000 0000 0000 0000 0000 ----------------------------------------------- 1111 0110 0000 0000 0000 0000 0000 0000
*/
#include <stdio.h> int xuanHuanzouYi(int n, int number); int xuanHuanYouYi(int n, int number);
int main(int argc, const char * argv[]) { int n;//需要移动的位数 int number;//需要进行左右移的数
printf("请输入需要进行左右移的数number"); scanf("%d", &number);
printf("请输入需要移动的位数n的值:"); scanf("%d", &n);
if (n>0) { int result = xuanHuanzouYi(n, number); printf("%d\n", result); } if (n<0) { int result = xuanHuanYouYi(n, number); printf("%d\n", result); }
return 0; }
int xuanHuanzouYi(int n, int number)//循环左移函数 { int zuoYi, youYi;
zuoYi = number << n; youYi = number >>(32-n);
int result = zuoYi ^ youYi;
return result; }
int xuanHuanYouYi(int n, int number)//循环右移函数 { int zuoYi, youYi;
youYi = number >> n; zuoYi = number << (32-n);
int result = youYi ^ zuoYi;
return result; }
|