if anweisung bit abhängig

Gast #994911
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
}
Gast
>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.
Gast
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.
Gast
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.
Gast
> 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)) { ... }
Gast
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
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
Persönliche Seite
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
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.