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

时间:2016-06-13 21:30:52

标签: c++ algorithm bit-manipulation

我正在尝试自己交换一个字节中的两个半字节。互联网上的解决方案似乎是显而易见的

( (x & 0x0F)<<4 | (x & 0xF0)>>4 )

我知道上述解决方案的工作原理。我试着自己看起来像这样

(((0x0F<<4)&(n)) | (0x0F & (n>>4)))

在第一个操作中:我正在尝试向左移动1111 4个位置,然后用&移动n以获得前四位。

在第二个操作中:我正在尝试将n 4位置向右移动,然后&移位1111以获得最后四位。

然后OR给出最终答案。

我的做法出了什么问题?

1 个答案:

答案 0 :(得分:7)

考虑二进制数字:

abcdwxyz

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

(x & 0x0F)<<4提供wxyz0000

(x & 0xF0)>>4提供0000abcd

所以最终答案是wxyzabcd

使用(((0x0F<<4)&(n)) | (0x0F & (n>>4)))时,(0x0F<<4)0xF0相同,因此:

(0xF0 & (n))提供abcd0000

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

所以最终答案是abcdabcd

相反,您可以尝试:

((0xF0 & (n<<4)) | (0x0F & (n>>4)))