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 :)
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 | |
2 | |
3 | |
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))
Gast
#4155566
Wenn man Bits abfragen will, darf man das übrigens auch genau so hinschreiben und das optimierende Bitschubsen dem Compiler überlassen.
1 | |
2 | |
3 | |
4 | |
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.
Gast
#4158079
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.
Gast
#4158089
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.