C - 我在编码"右转"功能

时间:2017-11-14 01:12:49

标签: c bitwise-operators

我在编写代码时遇到了一些麻烦,无法正确旋转我的十六进制数字。下面是我写的一个函数,如果你调用它,就像这样传递它:rotr(0x12345678,4),它应该返回0x81234567。相反,它只返回7位数(而不是8位,就像原始值= 0x12345678一样)。

有人可以帮我理解位级别的内容吗?我无法理解为什么我的当前代码返回0x123456f而不是0x81234567。提前谢谢!

编辑:是因为我过早地转移了0x12345678吗?我主要试图找出为什么只有七位数字返回,而不是八位。

unsigned int rotr(unsigned int x, int n) {
    int i; //iterate for loop
    unsigned int y; //masked last bit
    unsigned int z; //final result

    for (i=1; i<=n; i++) {
        y = x & 0x1; //isolates last bit
        x = x >> 1; //shift right 1
        z = x | (y << (sizeof(x)-1)); //shifts mask back to first slot; OR
                                      //it with x
    }

    return z;
}

2 个答案:

答案 0 :(得分:3)

sizeof(x)将以字节为单位给出变量的大小,而移位运算符则使用位数。您需要将这些操作数转换为使用相同的单位。

答案 1 :(得分:0)

而不是sizeof(x)你应该写8*sizeof(x),它看起来是通用的,因为你的输入可能是short int,long int或者任何东西。

对于右旋转而不是旋转循环,您可以尝试以下逻辑。

#include<stdio.h>
unsigned int rotr(unsigned int x, int n) {
        unsigned int z;
        z = (x >> n) | (x << (8*sizeof(int) - n)) ; 
        return z;
}
int main()
{
        unsigned  int num= 0x12345678, n = 4, ret;

        printf("before : %x\n",num);
        ret= rotr(num,n);
        printf("before : %x\n",ret);
}