Hallo http://www.mikrocontroller.net/articles/Bitmanipulation ich habe da ein Problem mit C und weiß nicht genau wie ich das hinbekomme Bei // prüfe ob Bit 0 und Bit 4 in der Variable tmp gesetzt sind // die Klammer ist wichtig! if ((tmp & 0x0011) == 0x8100) { darf nur bit 15 und 8 gesetzt sein. Wie bekomme ich ein "true", bei z.B. 0xA301.
Martin Michael schrieb: > // prüfe ob Bit 0 und Bit 4 in der Variable tmp gesetzt sind > // die Klammer ist wichtig! > if ((tmp & 0x0011) == 0x8100) { > > darf nur bit 15 und 8 gesetzt sein. Das widerspricht sich. Bit 0 und 4 oder Bit 15 und 8? Welches Schweinderl hätten's gern? > if ((tmp & 0x0011) == 0x8100) Dieser Ausdruck trifft nie zu. Das Resultat von tmp & 0x11 kann nur noch die Werte 0x00, 0x01, 0x10 und 0x11 annehmen -- daher ist ein Vergleich mit einer anderen Konstanten nie zutreffend.
Ja danke Dumm von mir if ((tmp & 0x8100) == 0x8100) { muss es heißen. Hat bei dem schwülen Wetter wohl einen Knoten im Kopf :)
:
Bearbeitet durch User
Das entspricht aber nicht dem Kommentar // prüfe ob Bit 0 und Bit 4 in der Variable tmp gesetzt sind
Martin Michael schrieb: > Ja > Dumm von mir > if ((tmp & 0x8100) == 0x8100) { funktioniert nicht. Wenn z.B. tmp = 0x8101 ist, wird der Inhalt der Klammer zu 0x8100 und die if-Bed. anschließend zu TRUE. Mit obigem Vergleich kann Du testen, ob mindestens Bit 15 und Bit 8 gesetzt sind. Wenn Du auschließlich auf Bit 15 und Bit 8 testen willst: if (tmp == 0x8100) Zum Testen/Spielen: printf("%#010x\n",(tmp & 0x8101));
Eher so
1 | // prüfe ob Bit 0 und Bit 7 in der Variable tmp gesetzt sind
|
2 | // die Klammer ist wichtig!
|
3 | if ( (tmp & 0x0081) == 0x0081 ) { |
Siehe Bitmanipulation.
while (((Status++ & 0x8100) == 0x8100) == 0) { } Das hatte ich eigentlich gesucht, kann man das auch kürzer ausdrücken ?
while ((Status++ & 0x8100) != 0x8100) while (!((Status++ & 0x8100) == 0x8100))
:
Bearbeitet durch User
Wenn man Bits abfragen will, darf man das übrigens auch genau so hinschreiben und das optimierende Bitschubsen dem Compiler überlassen.
1 | #define SOMMER (1 << 15)
|
2 | #define REGEN (1 << 8)
|
3 | |
4 | if ((tmp & SOMMER) && (tmp & REGEN)) |
5 | {
|
Danke für die Antworten Tom warum schiebt ihr in "C" "<<" das macht für mich Pascal den Code nur unleserlicher. Binär und Hex ist gut, warum definiert ihr "C" Pros sowas mit shift left.
Die Profis waren das nicht. Das war ein böser Norweger. :-) Es geht darum, das man mittels Konstanten ein Bit in einem Register identifiziert. Soviel ist ja klar. Dabei hat man mindestens zwei Möglichkeiten zur Wahl; 1. Man nimmt als Wert denjenigen, der sich bei (hexadezimaler, dezimaler, oktaler etc.) Interpretation des (als einzigem) gesetzten fraglichen Bits ergibt. 2. Man nimmt als Wert die Nummer des Bits um das sich handelt. (Von rechts, ab 0 gezählt). Derjenige welcher hat sich für Variante 2. entschieden. Das ist alles.
Martin Michael schrieb: > warum schiebt ihr in "C" "<<" das macht Damit man auf den ersten Blick sieht um welches bit es geht. mit tmp & (1 << 4) wird z.B. das 4. bit abgefragt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.