C - 我在编写 "rotate right" 函数时遇到问题

C - I'm having trouble coding a "rotate right" function

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

有人可以帮我理解位级别发生了什么吗?我无法理解为什么我当前的代码是 returning 0x123456f,而不是 0x81234567。提前致谢!

编辑:是不是因为我移动 0x12345678 太早了?我主要是想弄清楚为什么只有七位数 return 返回,而不是八位数。

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;
}

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

而不是 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);
}