【问题标题】:Swap two nibbles in a byte在一个字节中交换两个半字节
【发布时间】:2016-06-13 21:30:52
【问题描述】:

我正在尝试自己交换一个字节中的两个半字节。网上的解决方法好像很明显,就是

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

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

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

在第一个操作中:我试图将 1111 向左移动 4 个位置,然后将 &amp;n 一起移动以获得前四位。

在第二个操作中:我尝试将n 向右移动 4 位,然后将&amp;1111 一起移动以获取最后四位。

然后OR给出最终答案。

我的方法有什么问题?

【问题讨论】:

  • 您可以将0x0F&lt;&lt;4 简化为0xF0
  • 谢谢!!!不知道
  • 你试过了吗?它在工作吗?你的问题到底是什么?
  • 它不工作。是的,我试过了
  • 我不明白这个问题。您已经尝试过了,所以您知道有些输入没有得到正确答案(例如:0x01)。您在哪里调试为什么该方法不适用于这些数字?

标签: c++ algorithm bit-manipulation


【解决方案1】:

考虑一个二进制数:

abcdwxyz

使用( (x &amp; 0x0F)&lt;&lt;4 | (x &amp; 0xF0)&gt;&gt;4 )时:

(x &amp; 0x0F)&lt;&lt;4wxyz0000

(x &amp; 0xF0)&gt;&gt;40000abcd

所以最终答案是wxyzabcd

当使用(((0x0F&lt;&lt;4)&amp;(n)) | (0x0F &amp; (n&gt;&gt;4))) 代替时,(0x0F&lt;&lt;4)0xF0 相同,所以:

(0xF0 &amp; (n))abcd0000

(0x0F &amp; (n&gt;&gt;4))0000abcd

所以最终答案是abcdabcd

你可以试试:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多