【发布时间】:2014-03-25 00:00:32
【问题描述】:
大家好,我需要一点帮助来理解交换比特范围算法背后的逻辑。 “程序”在给定位置交换给定数量的连续位并且它工作得很好,但我需要了解它背后的逻辑才能继续讨论其他主题。 这是完整“程序”http://pastebin.com/ihVpseE1 的源代码,我需要有人告诉我到目前为止我是否走在正确的轨道上,并澄清我觉得难以理解的代码部分。
temp = ((number >> firstPosition) ^ (number >> secondPosition)) & ((1U << numberOfBits) - 1);
result = number ^ ((temp << firstPosition) | (temp << secondPosition));
(number >> firstPostion)将给定 uint 数 (5351) 的二进制表示向右 (>>) 移动 3 次 (firstPosition)。 所以 00000000 00000000 00010100 11100111 (5351) 变成 00000000 00000000 00000001 01001110 ,因为据我了解,当您移动位时,您会丢失超出范围的数字。对吗?还是最右边的位出现在左边?(number >> secondPosition)我应用与 .1 相同的逻辑,但在我的情况下 secondPosition 为 27,因此该数字仅由零组成(0) 00000000 00000000 00000000 00000000 (即数字 0) 我将数字 5351 的位向右移动 27 次,结果只有零。((number >> firstPosition) ^ (number >> secondPosition))我在 00000000 00000000 00000001 01001110 和 00000000 00000000 00000000 00000000 上使用 ^ 运算符 这导致数字 00000000 00000000 00000001 01001110 又名(((number >> firstPosition) ^ (number >> secondPosition))-
((1U << numberOfBits) - 1)这是我觉得困难的部分(如果我对1.2.3.的理解是正确的)((1U << numberOfBits) - 1)是否意味着- 1) 将 1 放在位置 3 (numberOfBits) 并用零 (0) 填充其余部分,然后从该数字的十进制表示中减去 1 或
- 2) 将数字 1 的二进制表示向左移动 3 次 (numberOfBits),然后从该数字的十进制表示中减去 1
如果到目前为止我的逻辑是正确的,那么我们将 & 运算符应用于 ((number >> firstPosition) ^ (number >> secondPosition)) 和 ((1U << numberOfBits) - 1) 的结果。
我遵循相同的逻辑
result = number ^ ((temp << firstPosition) | (temp << secondPosition));
为了得到结果。
很抱歉这个问题很长而且可能很愚蠢,但除了你们之外,我真的无法向任何人寻求帮助。提前谢谢大家。
【问题讨论】: