如何交换字节半字节?
How to swap byte nibbles?
给定这些字节(十六进制表示):
0F
1A
2C
如何获得:
F0
A1
C2
?
((x & 0x0f) << 4) | ((x & 0xf0) >> 4)
你可以这样做:
((x & 0x0f) << 4 ) | ((( x & 0xf0) >> 4) & 0xf )
这看起来很像 Josh Kelley 的回答,但 Josh 的回答是错误的。原因如下:
#include <stdio.h>
int main( int argc, char *argv[] )
{
signed char x = 0x80;
x >>= 4;
printf( "%x\n", x );
}
给出输出:
0xfffffff8
因为>>
运算符保留了移位操作数的符号位。即,最高有效位中的 1 将向左传播以保留值的符号。
给定这些字节(十六进制表示):
0F
1A
2C
如何获得:
F0
A1
C2
?
((x & 0x0f) << 4) | ((x & 0xf0) >> 4)
你可以这样做:
((x & 0x0f) << 4 ) | ((( x & 0xf0) >> 4) & 0xf )
这看起来很像 Josh Kelley 的回答,但 Josh 的回答是错误的。原因如下:
#include <stdio.h>
int main( int argc, char *argv[] )
{
signed char x = 0x80;
x >>= 4;
printf( "%x\n", x );
}
给出输出:
0xfffffff8
因为>>
运算符保留了移位操作数的符号位。即,最高有效位中的 1 将向左传播以保留值的符号。