XOR mit Set
spacer
Autor Nachricht
JSchirrmacher
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 27.12.11 11:02 
Habe zwei Sets die ich miteinander auf Unterschiede untersuchen will, z.B.

type
TFlag = (f1, f2, f3, f4);
TFlags = set of TFlag;

...

var
v1, v2, v3 :TFlags;

...

v1 := [f1, f3];
v2 := [f1, f4];

v3 := v1 XOR v2; // geht nicht

v3 hätte jetzt [f3, f4] als Inhalt

Ich möcht also wissen, welche flags sich geändert haben. Mit den Flags in integern könnte ich das lösen, aber dan habe ich die bequeme Lesbarkeit der Aufzählungen und sets nicht.

Idee?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15841
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Di 27.12.11 11:22 
Schnellschuss:
ausblenden Delphi-Quelltext markieren
1:
v3 := (v1 - v2) + (v2 - v1);
Vielleicht geht es noch einfacher.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
JSchirrmacher Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 27.12.11 11:34 
also funktionieren tut das anscheinend mit

v3 := (v1-v2) + (v2-v1);

aber von Eleganz ist da keine Rede. Denk ich da irgendwie falsch?
Mal gucken, was der Compiler daraus macht.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15841
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Di 27.12.11 11:47 
Sieht das vielleicht schöner für dich aus? ;-)
ausblenden Delphi-Quelltext markieren
1:
v3 := v1 + v2 - v1 * v2;
Es gibt AFAIK keinen Operator für die Menge der Elemente, die nicht in der Intersektion der beiden Mengen drin sind, also die Summe der Komplemente.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 452
Erhaltene Danke: 10

Win XP, Debian GNU/Linux
Delphi 2007 Enterprise, Java, C#
BeitragVerfasst: Di 27.12.11 11:52 
Mach dir doch eine Funktion aus dem, was Jaenicke schreibt.

ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
function Xor(Set1, Set2: TFlags): TFlags;
begin
Result := (Set1 - Set2) + (Set2 - Set1);
end;


Dann hast du's "eleganter":

ausblenden Delphi-Quelltext markieren
1:
Flags := Xor(Flags1, Flags2);
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
JSchirrmacher Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 27.12.11 13:36 
Besten Dank für die schnellen Antworten.

Ich liege also mit meiner Lösung richtig. (Man hat ja manchmal das Gefühl das es ganz einfach gehen müsste, aber man findets nicht).

Habe mal in den CPU-Code geguckt, was der Compiler aus dem Ausdruck (v1-v2) + (v2-v1) so macht:

Er macht mit 32bit-Registern 2x AND/NOT und ein OR hinterher, ist also effektiv. Wie so oft darf man in den Delphi-Compiler Vertrauen haben.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home