我很感兴趣如何使用按位操作将数字间隔从数字X交换到数字Y.
所以例如我有数字:
X = 00000000 Y = 00111111
positionStart,positionEnd
我想将X中的[positionStart,positionEnd]位替换为同一位置的Y位。
答案 0 :(得分:2)
如果您有一个掩码m
,表示您要移动或交换的位,您可以像这样移动它们:
x = x ^ ((x ^ y) & m)
或者像这样交换它们:
t = (x ^ y) & m
x ^= t
y ^= t
这可以解释为仅在设置x
的地方采用y
和m
之间的按位差异。然后对x
进行异或翻转x
中x
和y
不同(并设置m
)的位,以便更改x
的位数1}}成y
的位。同样的事情也适用于y
。
可能会创建一个掩码,如
m = (2 << end) - (1 << start)
答案 1 :(得分:1)
首先制作一个掩码(这假设类似Python的索引从最小到最重要,从零开始,不包括上层索引):
M = (1 << positionEnd) - 1) & ~((1 << positionStart) - 1)
如果您想将X
中的位替换为Y
中的位:
X = (X & ~M) | (Y & M)
如果你想交换,你可以使用第三个变量,或者可以做一些像蒙面的XOR trick:
X = (X & ~M) | ((X ^ Y) & M)
Y = (Y & ~M) | ((X ^ Y) & M)
X = (X & ~M) | ((X ^ Y) & M)