C-I';我在编码“a”时遇到困难;“向右旋转”;功能

C-I';我在编码“a”时遇到困难;“向右旋转”;功能,c,bitwise-operators,C,Bitwise Operators,我在编写代码以正确旋转十六进制数字时遇到了一些问题。下面是我编写的一个函数,如果调用它,像这样传递它:rotr(0x12345678,4),它应该返回0x81234567。相反,它只返回7位数字(而不是8位,如原始值=0x12345678) 有人能帮我理解比特级的情况吗?我无法理解为什么当前代码返回0x123456f而不是0x81234567。提前谢谢 编辑:是因为我太早移动0x12345678吗?我主要是想弄明白为什么只有七位数返回,而不是八位数 unsigned int rotr(unsig

我在编写代码以正确旋转十六进制数字时遇到了一些问题。下面是我编写的一个函数,如果调用它,像这样传递它: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;
}
unsigned int rotr(unsigned int x,int n){
int i;//循环迭代
无符号int y;//屏蔽最后一位
无符号int z;//最终结果
对于(i=1;i>1;//右移1
z=x |(y
sizeof(x)
将以字节为单位给出变量的大小,而移位运算符处理的是位数。您需要将这些操作数转换为使用相同的单位。

而不是
sizeof(x)
您应该编写
8*sizeof(x)
,它看起来很通用,因为您的输入可能是短整型、长整型或任何类型

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

#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);
}
#包括
无符号整数rotr(无符号整数x,整数n){
无符号整数z;

z=(x>>n)|(x
sizeof(x)
是4,但你希望它是32,对吗?你是想旋转一个位,还是一组由一个十六进制数字表示的四个位?你似乎混淆了位和十六进制数字。每个十六进制数字代表4bits@c-微笑你为什么认为
sizeof(x)==4
?或OP expected
32
?@Olaf您对
sizeof(unsigned int)
值有其他假设吗?它使用32-1,而不是使用sizeof(x)-1.然而,使用32在所有情况下都有效吗?我只是尝试旋转位,所以如果n等于3,结果应该是2468ACF,或0000 0010 0100 0110 1000 1010 1100 1111。int没有保证大小,但你可以通过一点数学来找到位。这两个代码之间的区别是什么?我尝试使用上面的代码(替换sizeof(x))使用sizeof(int)*8-1)和您的函数,虽然上面的代码和您的代码都可以旋转0x12345678,但如果我放0x1234(我必须考虑我的代码的任何十六进制和十进制值),我的代码就不起作用了。您的代码似乎也适用于0x1234,而我的代码则不起作用。z=x |(y@B.M.Corwen)你有吗?举个简单的例子,记下每次迭代的二进制数。你会明白为什么它不应该总是把y移到第31位?如果这个问题的答案看起来很明显,我很抱歉,但我是一个初学者,我似乎不能很好地理解这个概念。编辑:我发现如果你向右移动一点,我就不能似乎在x的开头加上y=0。前导零似乎消失了。