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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


/*  编写一个移位函数,使移位函数既能循环左移又能循环右移。参数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;
}


2 个回复

倒序浏览
这个题今天真是没有搞懂
回复 使用道具 举报

看过之后很有帮助
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马