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

C# 理解交换位范围背后的逻辑,c#,binary,xor,C#,Binary,Xor,大家好,我需要一些帮助来理解交换比特范围算法背后的逻辑。 “程序”在给定的位置交换给定数量的连续位,它工作得很好,但我需要理解它背后的逻辑,以便转到其他主题。 这是完整的“程序”的源代码,我需要有人告诉我,到目前为止,我是否在正确的轨道上,并澄清我发现难以理解的代码的一部分 temp = ((number >> firstPosition) ^ (number >> secondPosition)) & ((1U << numberOfBits) -

大家好,我需要一些帮助来理解交换比特范围算法背后的逻辑。 “程序”在给定的位置交换给定数量的连续位,它工作得很好,但我需要理解它背后的逻辑,以便转到其他主题。 这是完整的“程序”的源代码,我需要有人告诉我,到目前为止,我是否在正确的轨道上,并澄清我发现难以理解的代码的一部分

temp = ((number >> firstPosition) ^ (number >> secondPosition)) & ((1U << numberOfBits) - 1); 
result = number ^ ((temp << firstPosition) | (temp << secondPosition));
temp=((数字>>firstPosition)^(数字>>secondPosition))和((1U>)3次(第一位置)。
所以00000000 00000000 0000100 11100111(5351)变为00000000 00000000 0000000 1 01001110,因为据我所知,当移位位时,会丢失超出范围的数字。这正确吗?或者最右侧的位出现在左侧

  • (number>>secondPosition)
    我应用了与.1相同的逻辑,但在我的例子中secondPosition是27,因此数字只包含零(0)00000000000000000000000000000000(即数字0) 我将数字5351的位向右移动27次,结果只有零

  • ((数字>>第一位置)^(数字>>第二位置))
    我在00000000 00000000 00000001 01001110和00000000 00000000 00000000上使用^operator 结果是00000000000000000001 01001110 aka
    ((数字>>第一位置)^(数字>>第二位置))


  • ((1U第一位置)^(数字>>第二位置))
    ((1U您为
    4.
    提出的两个备选方案实际上是相同的:)
    诀窍在于,这会产生一个二进制
    1
    s字符串,最大为给定的
    个位数(即
    )(谢谢你。你的回答以及上面的主题帮助了我。尽管你说了,我还有一个问题(1)我昨晚花了3个小时用钢笔和笔记本试着用手做这个,每次我得到错误的结果,在冲洗缓冲区后,我最终用手得到正确的结果。结果是,当我移动第二个位置时,我移动了位27次,而不是24次。现在我每次都得到了正确的结果用手。再次感谢你,你太棒了。