黑马程序员技术交流社区
标题: 编写一个移位函数,使移位函数既能循环左移又能循环右... [打印本页]
作者: zhaofeizlj 时间: 2015-7-20 22:07
标题: 编写一个移位函数,使移位函数既能循环左移又能循环右...
/* 编写一个移位函数,使移位函数既能循环左移又能循环右移。参数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;
}
作者: 哒哒萌 时间: 2015-7-20 22:29
这个题今天真是没有搞懂
作者: 手残程序员 时间: 2015-7-20 22:29
看过之后很有帮助
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |