XNOR - wie umsetzen?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

XNOR - wie umsetzen?

Beitragvon Timm Thaler » 6. Feb 2018, 00:54 XNOR - wie umsetzen?

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...
Timm Thaler
 
Beiträge: 725
Registriert: 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
Nach oben

Beitragvon Warf » 6. Feb 2018, 04:28 Re: XNOR - wie umsetzen?

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
Warf
 
Beiträge: 985
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Timm Thaler » 6. Feb 2018, 11:36 Re: XNOR - wie umsetzen?

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.
Timm Thaler
 
Beiträge: 725
Registriert: 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
Nach oben

Beitragvon BeniBela » 8. Feb 2018, 01:23 Re: XNOR - wie umsetzen?

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
BeniBela
 
Beiträge: 248
Registriert: 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4) | 
CPU-Target: 64 Bit
Nach oben

Beitragvon Mathias » 8. Feb 2018, 18:11 Re: XNOR - wie umsetzen?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 8. Feb 2018, 23:33 Re: XNOR - wie umsetzen?

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.
Warf
 
Beiträge: 985
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Mathias » 9. Feb 2018, 18:47 Re: XNOR - wie umsetzen?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste

porpoises-institution
accuracy-worried