A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© donkey2 中级黑马   /  2014-11-15 09:57  /  1901 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

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


3 个回复

倒序浏览
20141115,火钳刘明。
回复 使用道具 举报
浅木头 发表于 2014-11-15 11:34
20141115,火钳刘明。

火钳?啥意思啊?
回复 使用道具 举报
donkey2 发表于 2014-11-15 17:01
火钳?啥意思啊?

就是在这个帖子火了之前赶快留下名字。火钳刘明就是这句话的简写+谐音。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马