überprüfen, ob mind 1 von 6 bit am port gesetzt ist

#4009828
Lesenswert?

Hi Leute,

irgendwie bin ich zu blöd um das im Titel genannte Problem zu lösen.
Wie kann ich mit einer kurzen Bitoperation/-vergleich überprüfen, ob 
mindestens ein Bit auf high ist?

Meine Idee war folgende:
1
if ((PORTB<<2) > 3) { process(); };
hierbei schiebe ich ja die Bits um 2 nach links, sodass Bit Nr6 und 7 
"verschwinden". Dann wäre jede mögliche Kombination größer 3.
Aber das funktioniert nicht.
Habe ich das Bitshifting nicht ganz verstanden? Werden die 
herausgeschobenen Bits auf der anderen Seite wieder eingeschoben?

Mein anderer Lösungsweg ist dieser:
1
if ((PORTB & 1<<PORTB0)|(PORTB & 1<<PORTB1)|(PORTB & 1<<PORTB2)|(PORTB & 1<<PORTB3)|(PORTB & 1<<PORTB4)|(PORTB & 1<<PORTB5)){
2
    process();
3
};
Allerdigns ist das etwas zu lang.
Das geht bestimmt eleganter.
Außerdem sollte die Operation nicht zu viele Takte in Anspruch nehmen.

Grüße
Der Anfänger
Moderator #4009838
Lesenswert?

Kaan Ayhan schrieb:
> Meine Idee war folgende:
>
>  if ((PORTB<<2) > 3) { process(); };
>
> hierbei schiebe ich ja die Bits um 2 nach links, sodass Bit Nr6 und 7
> "verschwinden".

Die Bits 6 und 7 verschwinden dadurch nicht, da die Schiebeoperation als
int (d.h. mit 16 Bit Breite) ausgeführt wird. Richtig wäre
1
if ((uint8_t)(PORTB<<2) > 3) { process(); };

Statt >3 würde auch schon >0 bzw. !=0 reichen oder einfach
1
if ((uint8_t)(PORTB<<2)) { process(); };

Der übliche Weg, einzelne oder mehrere Bits abzufragen, ist aber die
bitweise Und-Verknüpfing, wie von MaWin gezeigt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren