Frage zur Bitmaskierung

OP #2764576
Lesenswert?

Guten Abend alle zusammen,

ich habe hier mal eine Frage. Vielleicht habe ich einfach nur ein Brett 
vor dem Kopf oder ich bin wirklich zu blöd.
Also ich habe hier auf meinem Board 4 Taster und da ich platzsparend 
arbeiten will, möchte ich die 4 Zustände jedes Tasters mit 2 Bit in 
einem Byte speichern, also die ersten 2 Bit des Bytes für den ersten 
Taster, die zweiten 2 Bit für den zweiten Taster, und so weiter.

Dazu nehmen wir bei Programmstart einmal 0b00000000 an.

Meine Frage ist jetzt: Wie kann ich 2 bestimmte Bits dieses Bytes 
überschreiben? Jetzt denkt ihr sicher alle: Klar, mit einer Bitmaske. 
Ich will aber, dass sich die anderen Bits dabei nicht verändern.
Wie mache ich das?

Danke schonmal.

Gruß
Gast #2764584
Lesenswert?

> Klar, mit einer Bitmaske.
> Ich will aber, dass sich die anderen Bits dabei nicht verändern.

Wieso "aber"? DAS genau ist doch Sinn einer Bitmaske...
Wenn die Bits 1 werden sollen: logisches ODER mit den Bits.
Wenn die Bits 0 werden sollen: logisches AND mit dem Komplement der 
Bits.
OP #2764586
Lesenswert?

> Wieso "aber"? DAS genau ist doch Sinn einer Bitmaske...
> Wenn die Bits 1 werden sollen: logisches ODER mit den Bits.
> Wenn die Bits 0 werden sollen: logisches AND mit dem Komplement der
> Bits.

Das ist genau der Teil, wo ich ein Brett vor dem Kopf habe.
Ich denke irgendwie, dass die Bits bei einem logischen AND den Rest 
überschreiben und bei einem logischen ODER nicht das gewünschte Ergebnis 
bringen.
Gast #2764603
Lesenswert?

vielleicht so?

Tasten Status:
0babcdefgh

header:
1
#define TASTENSTATUS_SET_A    0b10000000
2
#define TASTENSTATUS_SET_B    0b01000000  
3
     
4
#define TASTENSTATUS_RESET_A  0b01111111 
5
#define TASTENSTATUS_RESET_B  0b10111111
6

7
#define TASTENSTATUS_SET_C    0b00100000
8
#define TASTENSTATUS_SET_D    0b00010000  
9
     
10
#define TASTENSTATUS_RESET_C  0b11011111 
11
#define TASTENSTATUS_RESET_D  0b11101111
12
...
main:
1
unsign char TastenStatus;
2

3
// Tasten Status 0 abfragen
4
if (..)
5
  {
6
    /* SET A */
7
    if (..)
8
      {
9
        TastenStatus |= TASTENSTATUS_SET_A;
10
      }
11
    /* RESET A */
12
    if(..)
13
       {
14
        TastenStatus &= TASTENSTATUS_RESET_A;
15
       }   
16
  }
17
...

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