2017-12-17 5 views
0

Wie kann ich Bereich der Bits von einer Variablen zum anderen klonen?Klonen Bits nach Bereich durch bitweise Ops auf C

Zum Beispiel, ich habe

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

Wie kann ich 6-Klon LSB-Bits von variablen dec2-dec?

Nach diesem Vorgang muss ich die nächsten 4 Bits von dec2 zu dec klonen, aber in einem Anfang des 2. Byte? (vom 9. am wenigsten signifikanten Bit) (dec ist wie eine "Maske").

Das gewünschte Verhalten ist:

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

"vom Ende" - was bedeutet das? Um Verwirrung zu vermeiden, verwenden wir typischerweise die Namen MSB (höchstwertiges Bit) und LSB (niedrigstwertiges Bit). – anatolyg

+1

Auch die Frage wäre klarer, wenn Sie nur eine "Bit-Klonen" -Operation gefragt haben. Wenn Sie wissen, wie man es macht, werden Sie wissen, wie man zwei macht. Oder, wenn es zwei sehr unterschiedliche Operationen gibt, zeigen Sie das gewünschte Ergebnis des ersten und dann das endgültige gewünschte Ergebnis. – anatolyg

+0

@anatolyg es bedeutet LSB, danke! – EmanRuoy

Antwort

1

Sie bitweise Operationen visualisieren können, wenn Sie zB Bit-Werte durch Buchstaben ersetzen:

dec = abcdefghijklmnop 
dec2 = ABCDEFGHIJKLMNOP 

Zuerst extrahieren Sie die benötigten Bits von DEC2 und ersetzen alle mit Nullen ruhen:

tmp2 = dec2 & 0b0000000000111111; 

Hier habe ich mitein binäres wörtlichen bin mitPräfix; Wenn Ihr Compiler dies nicht unterstützt, verwenden Sie ein entsprechendes hexadezimales Literal (wie 0x3f).

first operand: ABCDEFGHIJKLMNOP 
second operand: 0000000000111111 
result:   0000000000KLMNOP 

dann die Ziel Bits mit Nullen ersetzt werden:

tmp1 = dec & 0b1111111111000000; 

first operand: abcdefghijklmnop 
second operand: 1111111111000000 
result:   abcdedghij000000 

Schließlich tun eine bitweise OR:

res1 = tmp1 | tmp2; 

first operand: abcdedghij000000 
second operand: 0000000000KLMNOP 
result:   abcdefghijKLMNOP 

Dies ist eine weit verbreitete Eigenschaft der bitweise ODER-Operation - wenn Einer seiner Eingänge ist Null, es kopiert den anderen zum Ausgang.


Für Ihre zweite Operation benötigen Sie eine bitweise Verschiebung. Ohne in die Details, von denen die Bits Sie benötigen, können Sie immer noch die Visualisierungstechnik mit den Buchstaben verwenden:

temp = (dec2 & 0b0000001111000000) << 2; 

dec2 =    ABCDEFGHIJKLMNOP 
second operand: ......1111...... 
after bitwise AND: ......GHIJ...... 
after shift left: ....GHIJ........ 

Hier habe ich noch einen Punkt . ein Null-Bit darzustellen.