Frage zur Bitmaskierung

OP #2764576
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
> 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
> 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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.