首页 > 代码库 > C语言的那些题(二)——进制之循环移位

C语言的那些题(二)——进制之循环移位

今天,和大家分享一道关于进制问题中的循环移位,大家应该知道,系统语言中提供的按位左移 《 和按位右移 》都是非循环的。那什么叫循环移位呢?所谓循环移位是指在移位时不丢失移位前原范围的位,而是将它们作为另一端的补入位。例如循环右移n位,指各位右移n位,原来的低n位变成高n位,指各位右移n位,原来的低n位变成高n位。

接下来,我们看一下题目要求:输入一个字节内的数(0~255)和移动位数。输出移位结果(要求循环移位)

因为是一个字节内的数,有8位二进制数组成,所以移动的位数不会大于8。然后就要考虑一下是向左循环移位还是向右循环移位,这是两种情况,不能遗漏。

实现代码如下:

    unsigned char number = 0;
    unsigned char left = 0; // 存储向左移位结果
    unsigned char right = 0; // 存储向右移位结果
    int n = 0;  // 表示移动位数
    int copyNumber = 0;
    printf("输入一个字节内的数(0~255)和移动位数n:(n的绝对值不大于8,n>0代表向右移位,n<0代表向左):");
    scanf("%d%d", &copyNumber, &n); // 直接输入unsigned char类型的有警告,
    number = copyNumber;            // 所以定义了一个copyNumber
    if (n >= 0 && n <= 8) {         // n的绝对值不大于8,n>0代表向右移位
        right = number >> n;
        left = number << (8 - n);
        printf("向右循环移位结果:%d", right | left);
    } else if (n >= -8 && n < 0) {  // n的绝对值不大于8,n<0代表向左
        n = -n;
        left = number << n;
        right = number >> (8 - n);
        printf("向左循环移位结果:%d", right | left);
    } else {
        printf("输入错误,请重新输入.");
    }


本文出自 “一滴阳光” 博客,请务必保留此出处http://zhangzhanzg.blog.51cto.com/9168075/1532579