【问题标题】:How to reverse byte of a hexadecimal number? [duplicate]如何反转十六进制数的字节? [复制]
【发布时间】:2014-01-29 01:27:00
【问题描述】:

我想反转十六进制数的字节,例如:

0x08090a0b 应转换为 0x0b0a0908

我用过这个宏。

#define REV(X)      ((X << 24) | (((X>>16)<<24)>>16) | (((X<<16)>>24)<<16) | (X>>24))

【问题讨论】:

  • 那么你实现了你想要的吗?
  • 这个问题真的和取反一个整数不同吗?
  • 问题是什么?只有在 sizeof(X) &gt; 4 或 X 签名时,我才能看到这种方法的问题。
  • 你能给我们一些解决方案的限制吗?这是任意长度的十六进制数吗?它是作为字符串输入的,还是作为整数输入的?我想你的问题已经被问过,并且给出了一个很好的答案:stackoverflow.com/a/2182184/1967396
  • 解决方案没有限制。我只想反转 32 位整数的字节。输入是整数,输出也是整数。

标签: c


【解决方案1】:

check this #

  int main(void) 
  {
     // your code goes here
     unsigned int X = 0x08090a0b;

     printf("%8x", ((X << 24) | (((X>>16)<<24)>>16) | (((X<<16)>>24)<<16) | (X>>24)));
     return 0;
  }

您的输出是正确的。你是说 0 最初没有被显示?

09 = 9 在你的情况下 x0b0a0908 = b0a0908

【讨论】:

    【解决方案2】:

    如果将移位与掩码结合使用,则更简洁、更易于理解:下面我将分别展示完整的表达式及其组成部分。请注意,您不需要掩码中的前导零 - 我把它放在那里是为了清晰/对齐。而且你不需要第一个和最后一个术语的掩码,因为所有“不需要的”位都会从表达式中移出。

    #define REV(X) ((X << 24) | (( X & 0xff00 ) << 8) | (( X >> 8) & 0xff00 ) | ( X >> 24 ))
    

    一次一个字节:

    #define R1(X) ((X & 0x000000ff ) << 24 )
    #define R2(X) ((X & 0x0000ff00 ) <<  8 )
    #define R3(X) ((X & 0x00ff0000 ) >>  8 )
    #define R4(X) ((X & 0xff000000 ) >> 24 )
    

    要正确打印出数字,请使用

    printf("%08x", REV(x));
    

    这将确保打印前导零。您必须确保您的输入是 32 位无符号整数才能正常工作。

    【讨论】:

    • 非常简单的解释。脱帽致敬!
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2018-07-26
    • 2017-08-23
    • 1970-01-01
    • 2012-07-16
    • 2015-08-08
    • 1970-01-01
    • 2016-12-18
    相关资源
    最近更新 更多