我想要反转十六进制数字的字节,如:
0x08090a0b
应转换为0x0b0a0908
。
我使用过这个宏。
#define REV(X) ((X << 24) | (((X>>16)<<24)>>16) | (((X<<16)>>24)<<16) | (X>>24))
答案 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)
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