Problem mit einer ganz simplen Sache.
-
Servus.
Ich bin nicht soooo der Crack in Sachen C und stehe daher vor einem Problem.
Ich möchte alle Bits in einem Byte auf "0" setzen bis auf eines.
Mein Byte hat also z.B. den Wert:
1111 1010
Nun will ich alles auf 0 setzen (unabhängig vom Ausgangswert), bis auf z.B. Bit 5, also im Ergebnis so:
0001 0000
War das Bit 5 vorher schon nicht gesetzt, dann natürlich:
0000 0000Evtl. kann mir da einer "des Rätsels Lösung" klar und verständlich mitteilen... Alle Seiten im Netz konnten das nicht.
Ich bedanke mich bei euch.
Stefan
-
myByte&=(1<<4);
EDIT: Ach so, verständlich! Moment...
Hierzu musst du dich mit den Bitoperatoren beschäftigen. In dem Fall nutzen wir bitweises UND und Bitshift nach links. Wenn du eine beliebige Zahl und 0001 0000 "ver-und-est", dann bleibt nur das 5. Bit übrig. Und das auch nur, wenn es in beiden Zahlen vorkommt:
01010101 & 00010000 ---------- = 00010000 11001111 & 00010000 ---------- = 00000000
Du musst also nur deine Zahl mit 0001 0000 verunden. Und 0001 0000 kannst du darstellen, indem du 0000 0001 nimmst (also einfach 1) und dann die Bits um 4 Stellen nach links schiebst. Dazu nimmt man den Operator <<. Also:
int ergebnis=myByte & (1<<4);
Oder, wenn das Ergebnis in der Ursprungsvariablen gespeichert werden darf, halt wie oben gezeigt per Kurzschreibweise (&=).
-
Danke,
Magst Du es mir noch erklären?
Stefan
-
Dazu brauchst du die binäre (bitweise) Und-Verknüpfung: &
Nur wenn beide Bits 1 sind, ist auch das Ergebnis 1
`0 & 0 = 00 & 1 = 0
1 & 0 = 0
1 & 1 = 1
`
Bitweise bedeutet, das die jweils gleichen Bits einer Variablen verküpft werden und auch an der gleiche Stelle im Ergebnis stehen.1111 1010 (dein Byte) & 0001 0000 (die Maske) ----------- = 0001 0000 (das Ergebnis) ^ ^ | | | + Bit0 vom Byte (0) wird mit Bit0 von der Maske (0) UND-Verknüpft. Das Ergebnis ist 0 +----- Bit5 vom Byte (1) wird mit Bit5 von der Maske (1) UND-Verknüpft. Das Ergebnis ist 1
-
eupinkepank schrieb:
Danke,
Magst Du es mir noch erklären?
Stefan
Siehe mein EDIT oben.
-
Der Titel eines Themas sollte schon etwas präziser sein als so nichtssagend 'Problem mit einer ganz simplen Sache', wenn sich dafür jemand angesprochen fühlen soll. Bitte bei weiteren Anfragen daran denken!
-
_matze schrieb:
myByte&=(1<<4);
EDIT: Ach so, verständlich! Moment...
Hierzu musst du dich mit den Bitoperatoren beschäftigen. In dem Fall nutzen wir bitweises UND und Bitshift nach links. Wenn du eine beliebige Zahl und 0001 0000 "ver-und-est", dann bleibt nur das 5. Bit übrig. Und das auch nur, wenn es in beiden Zahlen vorkommt:
01010101 & 00010000 ---------- = 00010000 11001111 & 00010000 ---------- = 00000000
Du musst also nur deine Zahl mit 0001 0000 verunden. Und 0001 0000 kannst du darstellen, indem du 0000 0001 nimmst (also einfach 1) und dann die Bits um 4 Stellen nach links schiebst. Dazu nimmt man den Operator <<. Also:
int ergebnis=myByte & (1<<4);
Oder, wenn das Ergebnis in der Ursprungsvariablen gespeichert werden darf, halt wie oben gezeigt per Kurzschreibweise (&=).
Servus Matze.
1000 Danke an Dich, denn nun habe auch ich es begriffen und das Beste ist: Es klappt sogar
So sollte ein Tutorial aussehenLiebe Grüße,
Stefan