Forum: PC-Programmierung Abfrage ob bits gesetzt in "C"


von Martin M. (ats3788)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Martin M. (ats3788)


Lesenswert?

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
von Timmo H. (masterfx)


Lesenswert?

Das entspricht aber nicht dem Kommentar
// prüfe ob Bit 0 und Bit 4 in der Variable tmp gesetzt sind

von Franz M. (franzma)


Lesenswert?

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));

von Falk B. (falk)


Lesenswert?

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.

von Martin M. (ats3788)


Lesenswert?

while (((Status++ & 0x8100) == 0x8100) == 0)
{

}

Das hatte ich eigentlich gesucht,
kann man das auch kürzer ausdrücken ?

von (prx) A. K. (prx)


Lesenswert?

while ((Status++ & 0x8100) != 0x8100)
while (!((Status++ & 0x8100) == 0x8100))

: Bearbeitet durch User
von Tom (Gast)


Lesenswert?

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
{

von Martin M. (ats3788)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

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.

von OPV (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.