2017-12-17 12 views
0

どのようにして、ある変数から別の変数への範囲のクローンを作成できますか?例えば、私は、変数dec2からdecに6 LSBビットのクローンを作成するにはどうすればよいC言語のbitwise opsによる範囲別クローンのクローン

dec = decimal 49280, binary 11000000 10000000 
dec2 = decimal 445, binary  01 10111101 

がありますか?

この操作の後、次の4ビットをdec2からdecに複製する必要がありますが、2バイト目の先頭には? (9番目の最下位ビットから)(decは "マスク"のようなものです)。

望ましい動作は次のとおりです。

dec = 11000000 10000000 
dec2 =  01 10111101 
res1 = 11000000 10111101 
res2 = 11000110 10111101 
+1

「最後から」 - これはどういう意味ですか?混乱を避けるため、通常、MSB(最上位ビット)とLSB(最下位ビット)という名前を使用します。 – anatolyg

+1

また、「ビットクローニング」操作を1回だけ実行するように依頼すると、質問がより明確になります。あなたが1つを行う方法を知っているなら、あなたは2つを行う方法を知っているでしょう。または、2つの非常に異なる操作がある場合は、最初の操作の結果を表示し、次に最終的な結果を表示します。 – anatolyg

+0

@anatolyg LSBを意味する、ありがとう! – EmanRuoy

答えて

1

お手紙などによってビット値を交換する場合は、ビット単位の操作を視覚化することができます

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........ 

は、ここで私はゼロ・ビットを表すために、ドット .を使用しました。

関連する問題