在一个字节中交换两个半字节

Pik*_*chu 2 c++ algorithm bit-manipulation

我试图在我自己的一个字节中交换两个半字节.互联网上的解决方案似乎很明显

( (x & 0x0F)<<4 | (x & 0xF0)>>4 )
Run Code Online (Sandbox Code Playgroud)

我知道上述解决方案是如何工作的.我试着自己看起来像这样

(((0x0F<<4)&(n)) | (0x0F & (n>>4)))
Run Code Online (Sandbox Code Playgroud)

在第一种操作:我竟将11114位到左侧,然后&n得到的前四位.

在第二个操作中:我试图n向右移动4个位置,然后&1111最后四个位移动.

然后OR给出最终答案.

我的做法有什么问题?

Pet*_*vaz 7

考虑二进制数:

abcdwxyz
Run Code Online (Sandbox Code Playgroud)

使用时( (x & 0x0F)<<4 | (x & 0xF0)>>4 ):

(x & 0x0F)<<4wxyz0000

(x & 0xF0)>>40000abcd

所以最后的答案是wxyzabcd.

使用时,(((0x0F<<4)&(n)) | (0x0F & (n>>4)))与之(0x0F<<4)相同0xF0,所以:

(0xF0 & (n))abcd0000

(0x0F & (n>>4))0000abcd

所以最后的答案是abcdabcd.

相反,你可以尝试:

((0xF0 & (n<<4)) | (0x0F & (n>>4)))
Run Code Online (Sandbox Code Playgroud)