我认为答案是对第 2.9 节中的 getbits 示例的稍微修改的应用程序。
让我们分解如下:
Let bitstring x be 1 0 1 1 0 0
Let bitstring y be 1 0 1 1 1 1
positions -------->5 4 3 2 1 0
设置p = 4 and n =3
为我们提供了来自 x 的位串,即0 1 1
. 它从 4 开始,以 2 结束,跨越 3 个元素。
我们要做的是替换0 1 1
为1 1 1
(位串 y 的最后三个元素)。
让我们暂时忘记左移/右移,并将问题可视化如下:
我们需要从位串 y 中获取最后三位数字,即1 1 1
1 1 1
直接放在位串4 3 and 2
x 的位置下。
替换0 1 1
为1 1 1
同时保持其余位完好无损...
现在让我们更详细一点...
我的第一句话是:
We need to grab the last three digits from bitstring y which is 1 1 1
从位串中分离位的方法是首先从全为 0 的位串开始。我们最终得到0 0 0 0 0 0
.
0 具有这个令人难以置信的属性,其中按位 '&' 与另一个数字将给我们所有 0,而按位 '|' 与另一个数字将返回给我们另一个数字。
0 本身在这里没有用......但它告诉我们,如果我们 '|' y 的最后三位数字为“0”,我们将得到 1 1 1。y 中的其他位在这里并不真正关心我们,因此我们需要找到一种方法将这些数字归零,同时保持最后三位数字完好无损。本质上我们需要数字0 0 0 1 1 1
。
因此,让我们看一下所需的一系列转换:
Start with -> 0 0 0 0 0 0
apply ~0 -> 1 1 1 1 1 1
lshift by 3 -> 1 1 1 0 0 0
apply ~ -> 0 0 0 1 1 1
& with y -> 0 0 0 1 1 1 & 1 0 1 1 1 1 -> 0 0 0 1 1 1
这样我们就可以将最后三位数字用于设置目的......
我的第二个陈述是:
将 1 1 1 直接放在位串 x 的位置 4 3 和 2 下。
可以从第 2.9 节中的 getbits 示例中找到执行此操作的提示。我们对位置 4,3 和 2 的了解可以从值中找到p = 4 and n =3
。p 是位置,n 是位集的长度。结果p+1-n
给了我们从最右边位开始的位集的偏移量。在这个特定的例子p+1-n = 4 +1-3 = 2
中。
所以..如果我们在字符串上左移 2 0 0 0 1 1 1
,我们最终得到0 1 1 1 0 0
. 如果你把这个字符串放在 x 下,你会注意到它与 x1 1 1
的位置对齐4 3 and 2
。
我想我终于到了某个地方……我发表的最后一句话是……
将 0 1 1 替换为 1 1 1,同时保持其余位不变...
现在让我们回顾一下我们的字符串:
x -> 1 0 1 1 0 0
isolated y -> 0 1 1 1 0 0
对这两个值进行按位或运算可以为我们提供这种情况所需的信息:
1 1 1 1 0 0
但是,如果不是1 1 1
, 我们有1 0 1
......那么如果我们需要再挖掘一点才能找到我们的“银弹”......
让我们再看一遍上面的两个字符串......
x -> bit by bit...1(stays) 0(changes) 1(changes) 1(changes) 0(stays) 0(stays)
所以理想情况下..我们需要 bitstring 1 x x x 0 0
,其中 x 将与 1 交换。这是直觉的飞跃,它将帮助我们..
Bitwise complement of isolated y -> 1 0 0 0 1 1
& this with x gives us -> 1 0 0 0 0 0
| this with isolated y -> 1 1 1 1 0 0 (TADA!)
希望这篇长篇文章能帮助人们合理化和解决这些位掩码问题......
谢谢