1

我正在尝试在 C 中旋转十六进制数字。我遇到的问题是,每个循环。数字中出现更多的零。

这是我的代码:

int main (void) {
  int hex = 0x1234ABCD;
  for(int i=0; i<12;i++,hex <<=4){
    printf("0x%04x %d ",hex,hex );
    pattern(hex);
  }
    return 0;
}

我在这个站点上看到了一些其他代码,这些代码在班次中添加了 & 0x0F,但它对我不起作用。

这是我使用编译器的结果

0x1234abcd 305441741  0001 0010 0011 0100 1010 1011 1100 1101
0x234abcd0 592100560  0010 0011 0100 1010 1011 1100 1101 0000
0x34abcd00 883674368  0011 0100 1010 1011 1100 1101 0000 0000
0x4abcd000 1253888000  0100 1010 1011 1100 1101 0000 0000 0000
0xabcd0000 -1412628480  1010 1011 1100 1101 0000 0000 0000 0000

谢谢您的帮助。

4

2 回答 2

3

没有操作员可以为您进行轮换。您需要结合 2 个班次操作。此外,在进行位移操作时,您应该使用无符号值。

int main (void) {
  unsigned int hex = 0x1234ABCD;
  for(int i=0; i<12;i++) {
    printf("0x%04x %d ",hex,hex );
    pattern(hex);
    unsigned int upper = hex >> (sizeof(hex)*CHAR_BIT - 4);
    hex <<= 4;
    hex |= upper & 0x0F;
  }
  return 0;
}
于 2020-12-16T16:24:38.987 回答
1

当您对数字使用左移 ( <<) 运算符时,移动n位,然后该数字的最高有效n位丢失,而最低有效n位用零填充(如您所见)。

因此,为了执行按位旋转,您需要首先“保存”那些前 4 位,然后将它们放回原处(|在将它们向下移动到底部后使用运算符)。

因此,假设大小为 32 位int,如下所示:

#include <stdio.h>

int main(void)
{
    int hex = 0x1234ABCD;
    for (int i = 0; i < 12; i++) {
        printf("0x%04x %d ", hex, hex);
        pattern(hex);
        int save = (hex >> 28) & 0x0F; // Save TOP four bits of "hex" in BOTTOM 4 of "save"
        hex <<= 4;    // Now shift the bits to the left ...
        hex |= save;  // ... then put those saved bits in!
    }
    return 0;
}

注意:我们用移位后的值屏蔽该save值,0x0F以确保所有其他位都是0; 如果我们这样做,那么对于负数,我们可能会得到那些用1s 填充的其他位。

于 2020-12-16T16:30:08.093 回答