按位替换两个数字中的位

Stu*_*Fox 5 c++ bit-manipulation bitwise-operators solidity

我感兴趣的是如何使用按位运算将位间隔从数字 X 交换到数字 Y。

例如我有号码:

X = 00000000 Y = 00111111

位置开始、位置结束

我想用 Y 中相同位置的位替换 X 中的 [positionStart,positionEnd] 位。

har*_*old 5

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

x = x ^ ((x ^ y) & m)
Run Code Online (Sandbox Code Playgroud)

或者像这样交换它们:

t = (x ^ y) & m
x ^= t
y ^= t
Run Code Online (Sandbox Code Playgroud)

这可以解释为仅在设置的地方取x和之间的按位差异。然后与 进行异或运算,翻转和中不同的位(并且被设置),因此它将 的这些位更改为 的位。同样的事情也适用于.ymxxxymxyy


掩码可能会像这样创建

m = (2 << end) - (1 << start)
Run Code Online (Sandbox Code Playgroud)


jde*_*esa 1

首先制作一个掩码(这假设类似 Python 的索引从最低到最高有效,从零开始并且不包括上部索引):

M = (1 << positionEnd) - 1) & ~((1 << positionStart) - 1)
Run Code Online (Sandbox Code Playgroud)

如果您想将 中的位替换X为 中的位Y

X = (X & ~M) | (Y & M)
Run Code Online (Sandbox Code Playgroud)

如果你想交换,你可以使用第三个变量或者可以做一些类似于屏蔽异或技巧的事情

X = (X & ~M) | ((X ^ Y) & M)
Y = (Y & ~M) | ((X ^ Y) & M)
X = (X & ~M) | ((X ^ Y) & M)
Run Code Online (Sandbox Code Playgroud)