【问题标题】:Bitshift (rotation) with hexadecimal in C [duplicate]C中十六进制的位移(旋转)[重复]
【发布时间】:2021-03-27 08:00:36
【问题描述】:

我正在尝试在 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

感谢您的帮助。

【问题讨论】:

  • 是的,这就是左移的作用。
  • 您是否正在尝试旋转这些位?否则,您的代码正在做它应该做的事情。
  • 啊,是的,谢谢你,我正在尝试旋转它们。我应该澄清这一点。
  • @TimonDoo 为什么0x%04x 中的代码宽度为 4? 8 个十六进制数字是 8 吗?

标签: c hex byte-shifting


【解决方案1】:

没有操作员可以为您进行轮换。您需要结合 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;
}

【讨论】:

  • 如果您的平台有它,最直接的方法(尽管根本不是标准 C)可能就是使用内联汇编和适当的旋转指令。
  • 嘿,谢谢你的回答,我对 C 很陌生,不知道无符号值,但我正在检查它
【解决方案2】:

当您对数字使用左移 (&lt;&lt;) 运算符时,移动 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;
}

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

【讨论】:

    猜你喜欢
    • 2021-06-27
    • 2011-02-07
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 2012-11-07
    • 2014-06-25
    • 2017-12-30
    相关资源
    最近更新 更多