2016-06-13 136 views
2

我想在我自己的字节中交换两个半字节。互联网上的解决方案似乎很明显,这是在一个字节中交换两个半字节

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

我知道上述解决方案如何工作。我想我自己看起来像这样

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

在第一动作:我竟将1111 4位到左侧,然后用&n获得前四位。

在第二个操作中:我试图将n 4位置移到右边,然后&1111得到最后四位。

然后OR给出最终答案。

我的方法有什么问题?

+1

您可以简化'为0x0F << 4'只是'0xF0'。 – Jashaszun

+0

谢谢!!!不知道, – Pikachu

+0

你试过吗?它工作吗?你的问题到底是什么? – shrike

回答

7

考虑一些二进制:

abcdwxyz 

当使用((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)))