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给出最终答案.
我的做法有什么问题?
考虑二进制数:
abcdwxyz
Run Code Online (Sandbox Code Playgroud)
使用时( (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)))
Run Code Online (Sandbox Code Playgroud)