如何反转十六进制数字的字节?

时间:2014-01-10 07:05:29

标签: c

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

0x08090a0b应转换为0x0b0a0908

我使用过这个宏。

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

2 个答案:

答案 0 :(得分:1)

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

#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位无符号整数才能使其正常工作。

答案 1 :(得分:0)

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