Forum: Compiler & IDEs Bitmanipulation


von Motze (Gast)


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

von Falk B. (falk)


Lesenswert?


von Simon S. (-schumi-)


Lesenswert?

(VarEins & 0b11111000) | (VarZwei & 0b00000111)

von Martin B. (martin_b97)


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

: Bearbeitet durch User
von Simpel (Gast)


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

von ?!? (Gast)


Lesenswert?

Martin B. schrieb:
> Wenn es andersrum auch gehen soll, wirds komplizierter.

Warum komplizierter?
'Simon S.' hat es in einer Zeile vorgemacht, und 'Simpel' hat das ganze 
nochmal ausführlich erklärt.

von Motze (Gast)


Lesenswert?

Danke so wie Simpel es gemacht hat habe ich das auch gemacht.

Ich danke euch.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.