我在编写代码时遇到了一些麻烦,无法正确旋转我的十六进制数字。下面是我写的一个函数,如果你调用它,就像这样传递它: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;
}
答案 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);
}