Forum: Mikrocontroller und Digitale Elektronik if anweisung bit abhängig


von Anfänger (Gast)


Lesenswert?

Hallo ich habe eine Frage ich möchte eine if Anweisung erstellen die 
immer dann "startet" wenn bestimmte bit bedingungen erfüllt sind.

z.B. egal was in messwerte steht wenn an der stelle 0b.......1 eine 1 
ist und bei messwerte[2] an  der stelle 0b.......1. soll die die 
begingung erfüllt sein egal was die anderen bits machen.
1
messwerte[1] = PINB;
2
if ( messwerte )
3
{
4
Programm
5
}
6
7
messwerte[2] = PINC;
8
if ( messwerte )
9
{
10
Programm
11
}

von Flo (Gast)


Lesenswert?

if(messwerte[1] & 0x01) { ... }

von Anfänger (Gast)


Lesenswert?

gibt e da nicht eine schönere lösung

von 11833 (Gast)


Lesenswert?

gibt e nicht.
ist schön enug.

von Patrick (Gast)


Lesenswert?

>gibt e da nicht eine schönere lösung
Was gibt es denn daran auszusetzen? Das ist genau das, was Du wolltest. 
Nach dem & schreibst Du den Wert für das Bit, das Du abfragen willst. 
Ganz einfach. Und leserlich ist dann Dein Code auch noch.

von Anfänger (Gast)


Lesenswert?

kann man eine bestimmet stelle des 0b........ auch auf 0 abfragen.

z.B. 0b..0..1.. das messwert an diesen stellen genau das haben soll.
oder besser gesagt egal wie der code aussieht er soll immer das dritte 
bit ausblenden.

von Johannes M. (johnny-m)


Lesenswert?


von Daniel N. (Gast)


Lesenswert?

x = x & 0b11111011 löscht das dritte Bit.

Und jetzt schnapp dir bitte ein C Buch und zudem Literatur zu
logischen Verknüpfungen.

von Anfänger (Gast)


Lesenswert?

hey ich gebe auf messwerte eine 0b00101110 aber ich komme einfach nicht 
in die if anweisung.
1
if ((messwerte[2]&0b00001000) == 0b00001000)
2
{
3
}

Das mit der Bitmanipulation habe ich geschaft.

von unbedarfter_no1 (Gast)


Lesenswert?

> if ((messwerte[2]&0b00001000) == 0b00001000)

besser so:
1
if ((messwerte[2]&0b00001000) == 1)
oder so:
1
if (messwerte[2]&0b00001000)

von Anfänger (Gast)


Lesenswert?

danke

von Mano W. (Firma: ---) (manow)


Lesenswert?

unbedarfter_no1 wrote:

> besser so:
1
if ((messwerte[2]&0b00001000) == 1)

hast Du dass nicht so gemeint?
1
if ((messwerte[2]&0b00001000) > 0)

von Stefan E. (sternst)


Lesenswert?

unbedarfter_no1 wrote:

> besser so:
1
if ((messwerte[2]&0b00001000) == 1)

Das ist immer False.

von Flo (Gast)


Lesenswert?

> kann man eine bestimmet stelle des 0b........ auch auf 0 abfragen.

Ein Bit ist genau dann 0, wenn es nicht 1 ist.

if(!(messwerte[1] & 0x01)) { ... }

von Anfänger (Gast)


Lesenswert?

und was kann ich machen wenn ich nur eine bit nicht abfragen will z.B.
0b00101111 die bedibgung soll immer erfüllt sein wenn bit 0,1,2 und 5 
eine 1 hat egal was an bit 3 ist

von gast (Gast)


Lesenswert?

if (messwerte[2] >= 79) ...

von Helmut L. (helmi1)


Lesenswert?

if (messwerte[2] & 0xf7) ....

wird TRUE wenn Bit 0,1,2,4,5,6,7 = 1 ist. Bit 3 spielt keine Rolle

Gruss Helmi

von Anfänger (Gast)


Lesenswert?

Ist das richtig das alle Zeichen außer die letzten 3 Bit mit einer 1 
überschreiben werden

von Helmut L. (helmi1)


Lesenswert?

Es wird mit der Maske 11110111 maskiert

Also

Eingangsbyte    10100110
Maske           11110111
Ergebnis        10100110  -> mindestens ein bit 1 und damit True

Eingangsbyte    00001000
Maske           11110111
Ergebnis        00000000  -> kein Bit 1 und damit False

Gruss Helmi

von Lasse S. (cowz) Benutzerseite


Lesenswert?

Verarscht ihr ihn jetzt alle, oder hab ich ein Brett vorm Kopf? (Aus dem 
Standardumgangston hier im Forum schließe ich leider wohl mal eher auf 
ersteres...)

Mein Vorschlag wäre:
1
if (messwerte[2]&&0b00001000)
Noch schönere Alternative (und exakt gleichwertig, aber lesbarer):
1
if (messwerte[2]&&(1<<3))

Das sollte theoretisch reichen, oder? Von sowas wie
1
if ((messwerte[2]&0b00001000) == 0b00001000)
würde ich allerdings abraten, da das höchstwahrscheinlich messwerte[2] 
verändert.

Bei AVRs (kann ohne Controllerangabe ja nur raten...) gibt es aber auch 
den sbrs-Befehl (*S*kip if *B*it in *R*egister is *S*et). Wie man das in 
C direkt einbaut weiß ich allerdings nicht.


Für den Test, ob das Bit nicht gesetzt ist, bietet sich die Negation an:
1
if (!(messwerte[2]&&(1<<3)))

Gruß, CowZ

von Helmut L. (helmi1)


Lesenswert?

>if (messwerte[2]&&0b00001000)
                 ^^

Das ist ein logisches UND
was du hier brauchst ist ein binaeres UND

also

if (messwerte[2]&0b00001000)

Gruss Helmi

von Stefan E. (sternst)


Lesenswert?

Lasse S. wrote:

> Das sollte theoretisch reichen, oder? Von sowas wie
>
1
if ((messwerte[2]&0b00001000) == 0b00001000)
> würde ich allerdings abraten, da das höchstwahrscheinlich messwerte[2]
> verändert.

Sorry, aber das ist einfach nur Blödsinn. messwerte[2] wird dabei 
keinesfalls verändert.

von unbedarfter_no1 (Gast)


Lesenswert?

Ups, sorry, in meinen Programmen mache ich es doch auch richtig. 
***kopfschüttel***
1
if ((messwerte[2]&0b00001000) != 0)

von Lasse S. (cowz) Benutzerseite


Lesenswert?

Ups,

steinigt mich, ich hätte es verdient...

ich bitte vielmals um Entschuldigung... War also doch das Brett vor 
meinem Kopf... Sorry.

Gruß, CowZ

von Helmut L. (helmi1)


Lesenswert?

Geh hin in deine Ecke und schaem dich. Fuer die naechsten 2 Wochen 
darfst du keine Schleifen mehr programmieren sondern must den Code 
100mal abtippen.

Gruss Helmi

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.