お手紙などによってビット値を交換する場合は、ビット単位の操作を視覚化することができます
dec = abcdefghijklmnop
dec2 = ABCDEFGHIJKLMNOP
まず、DEC2から必要なビットを抽出し、すべて交換してください残りの0:
tmp2 = dec2 & 0b0000000000111111;
ここで私は0123でバイナリリテラルを使用しています接頭辞はです。コンパイラがそれをサポートしていない場合は、同等の16進リテラル(0x3f
など)を使用します。
first operand: ABCDEFGHIJKLMNOP
second operand: 0000000000111111
result: 0000000000KLMNOP
そしてゼロで目標ビットを置き換える:
tmp1 = dec & 0b1111111111000000;
first operand: abcdefghijklmnop
second operand: 1111111111000000
result: abcdedghij000000
を最後に、ビット単位のORを行う。
res1 = tmp1 | tmp2;
first operand: abcdedghij000000
second operand: 0000000000KLMNOP
result: abcdefghijKLMNOP
これは、ビット単位のOR演算の広く使用されているプロパティであるが - 場合その入力の1つがゼロであれば、他方の出力を出力にコピーします。
2回目の操作では、ビット単位のシフトが必要です。あなたが必要とするどのビットの詳細に入るがなければ、あなたはまだ文字で可視化技術を使用することができます。
temp = (dec2 & 0b0000001111000000) << 2;
dec2 = ABCDEFGHIJKLMNOP
second operand: ......1111......
after bitwise AND: ......GHIJ......
after shift left: ....GHIJ........
は、ここで私はゼロ・ビットを表すために、ドット
.
を使用しました。
「最後から」 - これはどういう意味ですか?混乱を避けるため、通常、MSB(最上位ビット)とLSB(最下位ビット)という名前を使用します。 – anatolyg
また、「ビットクローニング」操作を1回だけ実行するように依頼すると、質問がより明確になります。あなたが1つを行う方法を知っているなら、あなたは2つを行う方法を知っているでしょう。または、2つの非常に異なる操作がある場合は、最初の操作の結果を表示し、次に最終的な結果を表示します。 – anatolyg
@anatolyg LSBを意味する、ありがとう! – EmanRuoy