黑马程序员技术交流社区
标题: 1115-练习-一个位运算习题总结 [打印本页]
作者: donkey2 时间: 2014-11-15 09:57
标题: 1115-练习-一个位运算习题总结
本帖最后由 donkey2 于 2014-11-15 10:06 编辑
/*
编写一个移位函数,使移位函数既能循环左移又能循环右移。参数n大于0时便是左移,参数n小于0时便是右移
*/
#import <Foundation/Foundation.h>
int returnLR(int a,int n);
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
// NSLog(@"Hello, World!");
NSLog(@" 请输入一个数和移位方式(大于0时便是左移,小于0时便是右移)");
int x,y;
scanf("%i %i",&x,&y);
int result;
result = returnLR(x,y);
NSLog(@"得到的数为%i",result);
}
return 0;
}
int returnLR(int a,int n){
if (n > 0) {
return a << n;}
else if(n ==0)
return 0;
else
return a >> (-n);
}初步是这样,简单测试了一下没有问题。
但是,我没有考虑移动的边界问题,答案似乎也没有考虑到。(这里请高手指正)
而且我没有考虑到应该将要移动的数定义为无符号数。
也没考虑到左移31位相当于右移1位这样。
欢迎各位评价。
实际上标准答案是这样:
unsigned move(unsigned value, int n)
{
unsigned z;
if (n > 0) {
// 循环左移
z = (value >> (32 - n)) |(value << n);
}else
{
// 循环右移
n = -n;
z = (value << (32 - n)) |(value >> n);
}
return z;
}
int main(int argc, const char * argv[])
{
unsigned a;
int n;
printf("请输入一个八进制输:\n");
scanf("%d", &a);
printf("请输入要移位的位数:\n");
scanf("%d", &n);
printf("移位后的结果是:%o\n", move(a, n));
return 0;
}
作者: 浅木头 时间: 2014-11-15 11:34
20141115,火钳刘明。
作者: donkey2 时间: 2014-11-15 17:01
火钳?啥意思啊?
作者: 浅木头 时间: 2015-1-18 13:58
就是在这个帖子火了之前赶快留下名字。火钳刘明就是这句话的简写+谐音。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |