Forum: Compiler & IDEs logisches XOR in if-Abfrage


von R. F. (inet_surfer88)


Lesenswert?

Hallo,

ich möchte einen Portpin mit einem bestimmten Bit einer Variable 
vergleichen. Das ganze 16 mal. Es wird immer der gleiche Pin mit jedem 
Bit der 16-Bit-Variablen ein mal verglichen.

Die Abfrage soll in einer if-Abfrage erfolgen. Es soll immer dann ein 
True ausgegeben werden, wenn das Bit der Variablen und der Portpin 
unterschiedlich sind, also ein logisches XOR.

Wäre es eine logische UND-Verknüpfung, würde ich schreiben:
1
if ( PINC&(1<<2) && variable&(1<<bitnummer) )

Laut meinem C-Buch gibt es keine logische XOR-Verknüpfung, nur eine 
Bitweises XOR.

Wie könnte man das Problem lösen? Ich habe mir eine mögliche Lösung 
ausgedacht, finde es aber "unschön". Hat jemand eine Idee, wie man des 
Problem eleganter lösen könnte.

Meine Idee wäre:
1
if ( (PINC&(1<<2) && !(variable&(1<<bitnummer))) || (!(PINC&(1<<2)) && variable&(1<<bitnummer)) )


Danke und Gruß

von Lasse S. (cowz) Benutzerseite


Lesenswert?

Wie wäre es mit

((PINC&(1<<2)) != (variable&(1<<bitnummer)))

Gruß
Lasse

von SolarRainer (Gast)


Lesenswert?

Hallo R.F.,

das sollte z.B. so gehen:

if ( ((PINC&(1<<2))!=0) ^ ((variable&(1<<bitnummer))!=0) )

Also die beiden Werte erst mit "!=0" auf 0 und 1 normieren und dann 
bitweises xor verwenden.

@Lasse: deine Lösung wird so nicht funktionieren (bzw. nur, wenn 
zufällig bitnummer == 2 ist).
Denn (PINC&(1<<2)) und (variable&(1<<bitnummer)) haben andere Werte als 
1, wenn sie "wahr" sind, also wird der Vergleich immer "0" liefern.

von Thomas E. (thomase)


Lesenswert?

1
if (!!(PINC&(1<<2)) ^ !!(variable&(1<<bitnummer)))

mfg.

von R. F. (inet_surfer88)


Lesenswert?

Hallo,

danke an alle. Das ging ja schnell. Muss jetzt noch was löten, werde die 
Vorschläge dann morgen in mein Programm übernehmen und Berichten. Sieht 
auf jeden Fall übersichtlicher aus als meine Lösung. Vielen Dank.

von asdfasd (Gast)


Lesenswert?

Wenn du wirklich alle Bits in variable mit einem Pin vergleichen 
willst, bietet es sich an, das Pin-lesen und auswerten nur einmal zu 
machen.  Dann hast du auch keine Probleme, wenn sich zwischen zwischen 
zwei If-Abfragen auf einmal der Pin ändert.
1
    unsigned ungleich = (PINC & (1 << 2)) ? ~variable : variable;
2
3
    if (ungleich & (1 << bitnummer1))
4
        ...
5
    if (ungleich & (1 << bitnummer2))
6
        ...
7
    if (ungleich & (1 << bitnummer3))
8
        ...
9
    ...

Was die erste Zeile genau macht, bitte selbst rausklamüsern ;-)

von R. F. (inet_surfer88)


Lesenswert?

Hallo zusammen,

nochmals Danke an alle für die Antworten. Ich habe mein Programm fertig 
und es funktioniert.
Ich habe den Vorschlag von Thomas Eckmann genommen, und er funktioniert 
bestens. Allerdings habe ich die beiden Ausdrücke nicht doppelt negiert, 
so wie von Ihm vorgeschlagen, sondern nur einmal negiert. Bei der XOR 
ist das ja egal, ob jetzt beide 0 oder beide 1 sind, das Ergebnis ist 
das gleiche.

@asdfasd: Die erste Zeile hab ich jetzt auf den ersten Blick noch nicht 
verstanden, werd ich mir nachher oder morgen mal genauer anschauen, 
schon aus Interesse. Allerdings kann ich die Lösung nicht verwenden, da 
sich der Zustand des Pins wärend der Abfrage ändern kann. Es handelt 
sich um eine Serielle Übertragung, immer nach einem Taktsignal wird der 
Pin eingelesen und mit einem Bit der Variablen verglichen. Nach dem 
nächsten Takt wird das nächste Bit der Variablen verglichen, der Pin am 
Eingang kann sich mittlerweile geändert haben.


Danke und Gruß

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.