【问题标题】:understanding the logic behind swapping ranges of bits理解位交换范围背后的逻辑
【发布时间】:2014-03-25 00:00:32
【问题描述】:

大家好,我需要一点帮助来理解交换比特范围算法背后的逻辑。 “程序”在给定位置交换给定数量的连续位并且它工作得很好,但我需要了解它背后的逻辑才能继续讨论其他主题。 这是完整“程序”http://pastebin.com/ihVpseE1 的源代码,我需要有人告诉我到目前为止我是否走在正确的轨道上,并澄清我觉得难以理解的代码部分。

temp = ((number >> firstPosition) ^ (number >> secondPosition)) & ((1U << numberOfBits) - 1); 
result = number ^ ((temp << firstPosition) | (temp << secondPosition));
  1. (number &gt;&gt; firstPostion) 将给定 uint 数 (5351) 的二进制表示向右 (>>) 移动 3 次 (firstPosition)。 所以 00000000 00000000 00010100 11100111 (5351) 变成 00000000 00000000 00000001 01001110 ,因为据我了解,当您移动位时,您会丢失超出范围的数字。对吗?还是最右边的位出现在左边?

  2. (number &gt;&gt; secondPosition) 我应用与 .1 相同的逻辑,但在我的情况下 secondPosition 为 27,因此该数字仅由零组成(0) 00000000 00000000 00000000 00000000 (即数字 0) 我将数字 5351 的位向右移动 27 次,结果只有零。

  3. ((number &gt;&gt; firstPosition) ^ (number &gt;&gt; secondPosition)) 我在 00000000 00000000 00000001 01001110 和 00000000 00000000 00000000 00000000 上使用 ^ 运算符 这导致数字 00000000 00000000 00000001 01001110 又名 (((number &gt;&gt; firstPosition) ^ (number &gt;&gt; secondPosition))

  4. ((1U &lt;&lt; numberOfBits) - 1)这是我觉得困难的部分(如果我对1.2.3.的理解是正确的)((1U &lt;&lt; numberOfBits) - 1)是否意味着

    • 1) 将 1 放在位置 3 (numberOfBits) 并用零 (0) 填充其余部分,然后从该数字的十进制表示中减去 1 或
    • 2) 将数字 1 的二进制表示向左移动 3 次 (numberOfBits),然后从该数字的十进制表示中减去 1

如果到目前为止我的逻辑是正确的,那么我们将 & 运算符应用于 ((number &gt;&gt; firstPosition) ^ (number &gt;&gt; secondPosition))((1U &lt;&lt; numberOfBits) - 1) 的结果。 我遵循相同的逻辑 result = number ^ ((temp &lt;&lt; firstPosition) | (temp &lt;&lt; secondPosition)); 为了得到结果。

很抱歉这个问题很长而且可能很愚蠢,但除了你们之外,我真的无法向任何人寻求帮助。提前谢谢大家。

【问题讨论】:

    标签: c# binary xor


    【解决方案1】:

    您为4. 提出的两个替代方案实际上是相同的 :) 诀窍是这会产生一个二进制字符串1s,直到给定的numberOfBits - 即。 (1 &lt;&lt; 3) - 1 产生7111 二进制 - 换句话说,“只给我numberOfBits 最低有效位”。

    基本上,您已经很好地描述了这一点,尽管过于冗长。

    第一行的结果是numberOfBits 位序列。该值是从两个不同索引和numberOfBits long 开始的位序列之间的异或。然后and 简单地丢弃高于numberOfBits 的位。

    然后第二行利用a ^ b ^ a == bb ^ a ^ b == a 的事实,并且运算顺序无关紧要 - xor 运算是可交换的。

    只要两个序列不重叠且不超过小数点,它应该可以正常工作:)

    【讨论】:

    • 谢谢。您的回答以及上面的主题对我有帮助。尽管您说 (1
    • 昨晚我花了 3 个小时用笔和笔记本尝试手工制作,每次我得到错误的结果,在刷新缓冲区(即睡眠)后,我终于得到了正确的结果手。原来,当我移动 secondPosition 时,我移动了 27 次而不是 24 次。现在我每次手动都得到了正确的结果。再次感谢你太棒了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 2022-07-06
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多