Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Was ist eine Bitmaske ?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.05.2020, 14:25 Uhr
Zizzlag



Hallo, Ich wieder.

Könnte mir jemand bei der Frage helfen, was eine Bitmaske oder das Wort maskieren, in c/c++, bedeutet?
Ich werde leider nicht ganz schlau aus dem was mir Google gibt.
Der Ausdruck wird immer wieder im Zusammenhang mit dem Bit-operationen && und || verwendet, soweit
Ich verstanden habe. Komme aber mit der Bitmaske nicht weiter.
Wie && und || funktionieren weiß ich.

Würde mich sehr über Antwort freuen.
Mit Danke und grüßen.


Bearbeitung:

Ich habe mal die schmunzelnd, philosophische "Was isst eine Bitmaske?" Frage umformuliert.


Dieser Post wurde am 25.05.2020 um 20:53 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.05.2020, 20:29 Uhr
Hans
Library Walker
(Operator)


Moin,

die Bitmaske oder das maskieren kommt immer dann zu Einsatz, wenn man auf bestimmte Bits eines Bytes oder Wortes zugreifen will. Nehmen wir an, wir wollen wissen, ob das Bit 2 eines Bytes gesetzt ist, also den Wert 1 hat, oder nicht. Als erstes lesen wir dazu das Byte aus. Jetzt müssen wir das Bit 2 daraus isolieren, denn nur dessen Wert interessiert uns gerade. Dazu dient die Bitmaske. Das ist ein spezieller Wert, mit dem das gelesene Byte logisch verknüpft wird, damit am Ende nur noch der Wert des gewünschten Bits übrig bleibt. Diese logische Verknüpfung nennt man maskieren.
In Code sieht das dann etwa so aus:

C++:
///////////////////////////////////////////////////////////////////////////////////////////
x = Byte;       // das betreffende Byte lesen
maske = 0x04;   // hier definieren wir die Maske; Der Wert 0x04 entspricht binär 0000_0100,
                // was dem Bit 2 entspricht - von rechts her mit Null beginnend gezählt
x = x & maske;  // hier isolieren wir jetzt das Bit 2, oder wir maskieren es,
                // damit am Ende einzig dessen Wert über bleibt

/* Jetzt können wir das Bit auswerten: */

if ( x!=0 )
   {...}  // tue irgendwas
else
   {...}  // tue was anderes



Der andere Anwendungsfall für Bitmasken, also speziellen Bytes oder Wörtern zum gezielten Zugriff auf einzelne Bits ist, wenn wir in einem Byte oder Wort ein bestimmtes Bit verändern wollen. Dazu liesst man das Byte aus, führt die bitweise Verknüpfung (maskieren) mit einem speziellen Wert (Maske) durch und schreibt das so geänderte Byte oder Wort wieder zurück. Wenn wir also das Bit 2 eines Bytes setzen wollen, machen wir folgendes:


C++:
///////////////////////////////////////////////////////////////////////////////////////////
x = Byte;       // das betreffende Byte lesen
maske = 0x04;   // hier definieren wir die Maske; Der Wert 0x04 entspricht binär 0000_0100,
                // was dem Bit 2 entspricht - von rechts her mit Null beginnend gezählt
x = x | maske;  // hier setzen wir jetzt das Bit 2  und
byte = x;       // und schreiben es wieder zurück



Will man das Bit 2 löschen schreibt man:


C++:
///////////////////////////////////////////////////////////////////////////////////////////
x = Byte;       // das betreffende Byte lesen
maske = ~0x04;  // hier definieren wir die Maske: ~0x04 entspricht binär 1111_1011,
                // was dem Bit 2 entspricht - von rechts her mit Null beginnend gezählt
x = x & maske;  // hier löschen wir jetzt das Bit 2 oder: "wir setzten es zurück",
                // was das selbe bedeutet
byte = x;       // und schreiben das Byte wieder zurück




Um ein bestimmtes Bit zu löschen braucht man eine andere Maske, weil das "ausmaskieren" mit dem bitweisen UND, also mit & erfolgt. Damit dabei auch wirklich nur das gewünschte Bit gelöscht wird, setzt man alle anderen auf "1". Das erreicht man, indem man die Maske mit dem Komplement-operator (der Tilde) invertiert.


Oft sieht man auch solche Konstruktionen:

C++:
x = 1<<2;
y = ~(1<<2);


Das sind spezielle Konstrukte um die Maske zu bauen, damit man keine Konstanten definieren muss, wie ich das in den Beispielen oben gemacht habe. Denn beim definieren der Konstanten kann man sich leicht mal verzählen und dadurch die Fehlersuche erschweren.

Jetzt stellt sich wahrscheinlich noch die Frage, wo man das braucht? - Die Antwort ist: meistens in der hardwarenahen Programmierung, wo einzelne Bits bestimmte Zustände des Gerätes anzeigen. Die Bytes sind dabei meisstens irgendwelche Register, also spezielle Speicherzellen, die Gerätezustände anzeigen (dann sind es Statusregister) oder mit denen sich bestimmte Aktionen aktivieren oder stoppen lassen. Dann sind es Steuerregister. Das einfachste Beipiel ist das ein- oder ausschalten einer Leuchtdiode an einem Mikrocontroller. Da korrespondiert ein Bit eines solchen Registers direkt mit einem Anschlusspin des Chips und jenachdem, welchen Wert man in das Register schreibt, schaltet man den Spannungspegel an den zugehörigen Pinnen um.
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 25.05.2020 um 20:37 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: