答えは、セクション 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 の最後の 3 つの要素) に置き換えることです。
しばらく左シフト/右シフトを忘れて、次のように問題を視覚化しましょう。
ビット文字列 y から最後の 3 桁を取得する必要があります。1 1 1
ビット文字列 x1 1 1
の位置の直下に配置します。4 3 and 2
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 の最後の 3 桁が「0」の場合、最終的には 1 1 1 になります。y の他のビットは、ここではあまり関係ないので、これらの数値をゼロにしながら、最後の 3 桁はそのままです。本質的に、番号が必要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
そして、このようにして、目的を設定するために使用される最後の 3 桁が得られます...
私の2番目の声明は次のとおりです。
ビット文字列 x の位置 4 3 と 2 のすぐ下に 1 1 1 を配置します。
これを行うためのヒントは、セクション 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 の下に置くと、x の1 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
これら 2 つの値に対してビット単位の or を実行すると、この場合に必要なものが得られます。
1 1 1 1 0 0
1 1 1
しかし、もし の代わりにがあったとしたら、これは失敗するでしょう1 0 1
...だから、「銀の弾丸」にたどり着くためにもう少し掘り下げる必要があるとしたら...
上記の 2 つの文字列をもう一度見てみましょう...
x -> bit by bit...1(stays) 0(changes) 1(changes) 1(changes) 0(stays) 0(stays)
1 x x x 0 0
したがって、理想的には、x が 1 に置き換えられる bitstring が必要です。ここに私たちを助ける直感の飛躍があります..
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!)
この長い投稿が、このようなビットマスキングの問題を合理化し、解決するのに役立つことを願っています...
ありがとう