理解交换位范围背后的逻辑

时间:2014-03-24 13:34:11

标签: c# binary xor

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

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

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

  3. ((number >> firstPosition) ^ (number >> secondPosition)) 我在00000000 00000000 00000001 01001110和00000000 00000000 00000000 00000000上使用^运算符 这导致数字00000000 00000000 00000001 01001110 aka (((number >> firstPosition) ^ (number >> secondPosition))

  4. ((1U << numberOfBits) - 1)这是我觉得困难的部分(如果我对1. 2. 3.的理解是正确的话)((1U << numberOfBits) - 1)是否意味着

    • 1)将1放在位置3(numberOfBits)并用零(0)填充其余部分,然后从该数字的十进制表示中减去1 OR
    • 2)将数字1的二进制表示向左移动3次(numberOfBits),然后从该数字的十进制表示中减去1
  5. 如果到目前为止我的逻辑是正确的,那么我们应用&amp;运算符((number >> firstPosition) ^ (number >> secondPosition))((1U << numberOfBits) - 1)的结果。 我遵循相同的逻辑 result = number ^ ((temp << firstPosition) | (temp << secondPosition)); 为了得到结果。

    对不起这个漫长且可能很愚蠢的问题,但除了你们之外,我真的无法向任何人寻求帮助。谢谢你们所有人。

1 个答案:

答案 0 :(得分:0)

你为4.提出的两种选择实际上是相同的:) 诀窍是,这会产生一串二进制1 s,直到给定的numberOfBits - 即。 (1 << 3) - 1生成7或二进制111 - 换句话说,“只给我numberOfBits个最低位”。

基本上,如果过于冗长,你已经很好地描述了这一点。

第一行的结果是numberOfBits位的序列。该值是从两个不同索引开始并且numberOfBits长的比特序列之间的xor。 and然后只丢弃高于numberOfBits的位。

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

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

相关问题