Stu*_*Fox 5 c++ bit-manipulation bitwise-operators solidity
我感兴趣的是如何使用按位运算将位间隔从数字 X 交换到数字 Y。
例如我有号码:
X = 00000000 Y = 00111111
位置开始、位置结束
我想用 Y 中相同位置的位替换 X 中的 [positionStart,positionEnd] 位。
如果您有一个掩码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)
首先制作一个掩码(这假设类似 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)
| 归档时间: |
|
| 查看次数: |
2100 次 |
| 最近记录: |