logisches XOR in if-Abfrage

OP #4032509
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ß
Gast #4032537
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.
Gast #4032675
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 ;-)
OP #4033327
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ß

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.