我想要反转十六进制数的字节,例如:
0x08090a0b
应该转换为 0x0b0a0908
。
我已经使用了这个宏。
#define REV(X) ((X << 24) | (((X>>16)<<24)>>16) | (((X<<16)>>24)<<16) | (X>>24))
我想要反转十六进制数的字节,例如:
0x08090a0b
应该转换为 0x0b0a0908
。
我已经使用了这个宏。
#define REV(X) ((X << 24) | (((X>>16)<<24)>>16) | (((X<<16)>>24)<<16) | (X>>24))
如果你将移位和掩码结合起来,代码会更加简洁易懂:下面我展示完整表达式和其各个组成部分。请注意,在掩码中不需要前导零 - 我只是为了清晰/对齐而添加的。而且,在表达式的第一个和最后一个术语中不需要掩码,因为所有“不需要”的位都会从表达式中移出。
#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位无符号整数,以便它能够正确工作。
请查看此链接 #
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
sizeof(X) > 4
或者 X 是有符号时,那种方法存在问题。 - Aki Suihkonen