XNOR - wie umsetzen?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

XNOR - wie umsetzen?

Beitrag von Timm Thaler »

Ich habe gerade einen Knoten im Kopf. Ich brauche für eine Funktion

Code: Alles auswählen

val := v1 xor v2 xor v3 xor v4;


mit val, v1..v4 als uint32 die entsprechende Verknüpfung als XNOR. Also

Code: Alles auswählen

val := v1 xnor v2 xnor v3 xnor v4;


Da es nun keinen Operator XNOR gibt, muss ich das mit XOR und NOT realisieren. Aber wie? Für zwei Variablen wäre es

Code: Alles auswählen

val := not (v1 xor v2);


Aber für vier? Ist das dann

Code: Alles auswählen

val := not (v1 xor v2 xor v3 xor v4);


Scheint mir zu einfach...

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: XNOR - wie umsetzen?

Beitrag von Warf »

XNOr ist links assoziativ, also ist x1 xnor x2 xnor x3 = (x1 xnor x2) xnor x3
Durch einsetzen als xor als not (not (x1 xor x2) xor x3)
Außerdem gilt Not (x1 xor x2) = not x1 xor x2 = x1 xor not x2
Also not (not (x1 xor x2) xor x3) = not not (x1 xor x2) xor x3 = x1 xor x2 xor x3

Wenn mich nicht alles täuscht dürfte das für jedes xnor über Eine ungerade Zahl an Variablen gelten Variablen gelten, solltest du aber eventuell nochmal per Hand nachrechnen.

Ist die Zahl der Variablen grade also z.B. x1-x4:
Not (not (not (x1 xor x2) xor x3) xor x4 = not (x1 xor x2) xor x3 xor x4 = not x1 xor x2 xor x3 xor x4

Vereinfacht kann man es sich so vorstellen, für n Variablen stehen im Term n-1 xnors, es gibt also n-1 nots. Ist die Anzahl an not grade (also die Anzahl an x ungerade), kürzt sich alles weg, wenn nicht bleibt ein not übrig

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: XNOR - wie umsetzen?

Beitrag von Timm Thaler »

Hab nochmal Wahrheitstabelle gebastelt, und da sieht es so aus, dass...

... bei ungerader Anzahl Variablen XNOR durch XOR ersetzt werden kann:

Code: Alles auswählen

v1 xnor v2 xnor v3 = v1 xor v2 xor v3


... bei gerader Anzahl von Variablen XNOR durch NOT ( XOR ) ersetzt werden kann:

Code: Alles auswählen

v1 xnor v2 xnor v3 xnor v4 = not (v1 xor v2 xor v3 xor v4)


Im Code getestet und funktioniert auch.

BeniBela
Beiträge: 308
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: XNOR - wie umsetzen?

Beitrag von BeniBela »

So einen Operator kann man sich definieren

Code: Alles auswählen

 
{$MACRO on}
{$DEFINE xnor:=xor not}
 


Dann einfach

Code: Alles auswählen

v1 xnor v2 xnor v3

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: XNOR - wie umsetzen?

Beitrag von Mathias »

Das wusste ich gar nicht, da man solche Sachen auch mit FPC/Lazarus machen kann. :shock:
#define kenne ich nur von C/C++.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: XNOR - wie umsetzen?

Beitrag von Warf »

Mathias hat geschrieben:Das wusste ich gar nicht, da man solche Sachen auch mit FPC/Lazarus machen kann. :shock:
#define kenne ich nur von C/C++.


Aus gutem Grund- Defines sind echt widerlich.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: XNOR - wie umsetzen?

Beitrag von Mathias »

Aus gutem Grund- Defines sind echt widerlich.
In der Regal ja, aber es gibt gewisse Sachen, das ist es recht praktisch.
ZB. so was,

Code: Alles auswählen

#define PChar(pointer) reinterpret_cast<char*>(&pointer)

sonst muss man immer den Cast schreiben.
Aber in Pascal, braucht man sowas nicht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten