本帖最后由 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; }
|