按位替换两个数字中的位

时间:2018-02-23 13:28:58

标签: c++ bit-manipulation bitwise-operators solidity

我很感兴趣如何使用按位操作将数字间隔从数字X交换到数字Y.

所以例如我有数字:

X = 00000000 Y = 00111111

positionStart,positionEnd

我想将X中的[positionStart,positionEnd]位替换为同一位置的Y位。

2 个答案:

答案 0 :(得分:2)

如果您有一个掩码m,表示您要移动或交换的位,您可以像这样移动它们:

x = x ^ ((x ^ y) & m)

或者像这样交换它们:

t = (x ^ y) & m
x ^= t
y ^= t

这可以解释为仅在设置x的地方采用ym之间的按位差异。然后对x进行异或翻转xxy不同(并设置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)