Bitmanipulation

Gast #3892692
Lesenswert?

Hallo liebe Gemeinde,

Ich habe zwei uint8_t und den einen möchte ich mit den andere 
überschreiben. Ich will aber nur die untersten drei Bits überschreiben.

z.B.:
  01100000
  00000100
= 01100100 (Das soll bei Rauskommen)

Nur die untersten drei Bits sollen verändert werden.

zweites Bsp.:

  01100101
  00000101
= 01100101

Die anderen 5 Bits von der ersten Variablen sollen so bleiben wie sie 
sind.

Ich hoffe es ist verständlich.

Lg Motze
#3892786
Lesenswert?

Hallo,

in deinem Beispiel werden nur Nullen zu Einsen, dann würde es so gehen:
1
#include <inttypes.h>
2
#include <stdio.h>
3

4
int main (void)
5
{
6
setbuf(stdout, NULL);
7
uint8_t a = 0b01100000;
8
uint8_t b = 0b00000100;
9
uint8_t c;
10
c = a | (b & 0x07); 
11
printf("%x", c);
12
}

Wenn es andersrum auch gehen soll, wirds komplizierter.

Martin
Gast #3892788
Lesenswert?

Hallo Motze,

z.B.:
  01100011
  10000100
= 01100100 (Das soll bei Rauskommen)

Hab dein Beispiel etwas abgeändert, damit es besser klar wird. Im oberen 
Wert hast du hinten 011 stehen. Du möchtest jetzt nur diese letzten 3 
Bits durch die letzen 3 Bits der zweiten Zahl, also 100 ersetzen.



Du brauchst dafür 2 Bit-Masken. Man könnte es bildlich so sagen: Die 
eine ist die Stanzmaske und die andere die Füllmaske.

1.) Die Stanzmaske (11111000) schneidet mit Hilfe des Bitoperators "AND" 
aus der oberen Binär-Zahl erstmal die letzten 3 Bits raus:

      01100011
  AND 11111000
   =  01100000

Nun hat die obere Zahl bei den letzte 3 Bits quasi ein "Loch", das aus 
Nullen besteht. Und zwar genau dort, wo die Stanzmaske auch ihre Nullen 
hatte.

2.) Von der zweiten Zahl (10000100) sollen ebenfalls nur die letzten 3 
Bits in das oben zuvor ausgestanzte "Loch" eingefügt werden. Dazu stanzt 
du jetzt die vorderen 5 Bits der zweiten Zahl weg. Wieder mit dem 
AND-Operator und diesmal eben mit den vorderen 5 Nullen der Füllmaske.:

     10000100
AND  00000111
 =   00000100

Die vorderen 5 Bits sind dadurch wieder zu einem "Loch" aus Nullen 
geworden, so dass nur noch die benötigten hinteren 3 Bits der 
ursprünglichen Zahl übrig sind.

3.) Jetzt kannst du mit dem Bitoprarator "ODER" bzw. "OR" die beiden 
aufeinander genau zugestanzten Werte "zusammenkleben":

     01100000
 OR  00000100
  =  01100100 ==> Dein gewünschtes Ergebnis, das nur die letzten 3 Bits 
von der zweiten Zahl auf die letzten 3 bits der ersten Zahl übertragen 
hat...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren