我正在尝试自己交换一个字节中的两个半字节。互联网上的解决方案似乎是显而易见的
( (x & 0x0F)<<4 | (x & 0xF0)>>4 )
我知道上述解决方案的工作原理。我试着自己看起来像这样
(((0x0F<<4)&(n)) | (0x0F & (n>>4)))
在第一个操作中:我正在尝试向左移动1111
4个位置,然后用&
移动n
以获得前四位。
在第二个操作中:我正在尝试将n
4位置向右移动,然后&
移位1111
以获得最后四位。
然后OR
给出最终答案。
我的做法出了什么问题?
答案 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)))