If (sr.Attr and FileAttrs) = sr.Attr then ?

Hallo,

was bedeutet

if (sr.Attr and FileAttrs) = sr.Attr then

wenn sr.Attr und FileAttrs Integers sind?

Vielen Dank,
Jan

was bedeutet

if (sr.Attr and FileAttrs) = sr.Attr then

wenn sr.Attr und FileAttrs Integers sind?

Das ist ein logisches (boolesches) UND und bedeutet umgangsprachlich

„Wenn mindestens alle Bits, die in sr.Attr 1 sind, auch in FileAttrs 1 sind, dann…“

Gruß,

Michael

Hallo,

if (sr.Attr and FileAttrs) = sr.Attr then

ist eine Bit-weise UND Verknüpfung, die folgendes macht:

Ist das x-te Bit von der ersten Variabel und das x-te Bit von der zweiten Variabel identisch, dann kommt als Ergebnis 1 raus.
Sind sie nicht identsich kommt 0 raus.

Aus 0,0 => 0
Aus 0,1 => 0
Aus 1,0 => 0
Aus 1,1 => 1

Außerdem fällt mir bei dieser Abfrage auf, dass sie im Grunde übertrieben ist, denn:

if (sr.Attr and FileAttrs) = sr.Attr then

macht eine Bit-weise UND-Verknüpfung und es kann nur gleich sr.Attr sein, wenn sr.Attr = FileAttrs. Denn wenn sie ungleich sind, dann ergibt die Verknüpfung eine andere Zahl als sr.Attr,
zum Beispiel:

(1 and 0) = 1 ist falsch
(0 and 1) = 0 ist falsch
(0 and 0) = 0 ist richtig
also die beiden Variablen beim x-ten Bit identisch
(1 and 1) = 1 ist auch richtig

Also würde hier nur reichen:
if FileAttrs = sr.Attr then …

Gruss Thomas

Hallo Thomas!

erlaube mir, ein paar Aussagen in Deinem Posting richtigzustellen.

if (sr.Attr and FileAttrs) = sr.Attr then

ist eine Bit-weise UND Verknüpfung, die folgendes macht:

Ist das x-te Bit von der ersten Variabel und das x-te Bit von
der zweiten Variabel identisch, dann kommt als Ergebnis 1
raus.
Sind sie nicht identsich kommt 0 raus.

Was Du hier beschreibst, ist nicht die „AND“-Verknüpfung, sondern ein „NOT XOR“. Die Bits müssen nicht identisch sein, sondern sie müssen beide gleich 1 sein, damit die AND-Operation eine „1“ ausspuckt. Bitte Unterschied klarmachen!

Aus 0,0 => 0
Aus 0,1 => 0
Aus 1,0 => 0
Aus 1,1 => 1

So ist es.

Außerdem fällt mir bei dieser Abfrage auf, dass sie im Grunde
übertrieben ist, denn:

if (sr.Attr and FileAttrs) = sr.Attr then

macht eine Bit-weise UND-Verknüpfung und es kann nur gleich
sr.Attr sein, wenn sr.Attr = FileAttrs.

Nein, das stimmt nicht. Der Witz ist doch gerade, daß die Variablen nicht auf die Werte „0“ und „1“ festgelegt sind, sondern z. B. auch gleich 5 oder gleich 14 oder gleich 3476 sein können!

Also würde hier nur reichen:
if FileAttrs = sr.Attr then …

Nein, es würde nicht reichen.

Z. B. ist der Wert des Booleschen Ausdrucks „107 AND 66 = 66“ gleich TRUE, aber der Wert des Booleschen Ausdrucks „107 = 66“ ist gleich FALSE.
Zur Kontrolle:

 dezimal 107 = binär 01101011 
 dezimal 66 = binär 01000010 

Nix für ungut wegen der Korrekturen…

Mit freundlichem Gruß
Martin

Hallo erstmal,

erlaube mir, ein paar Aussagen in Deinem Posting
richtigzustellen.

Hab nichts dagegen.

ist eine Bit-weise UND Verknüpfung, die folgendes macht:

Ist das x-te Bit von der ersten Variabel und das x-te Bit von
der zweiten Variabel identisch, dann kommt als Ergebnis 1
raus.
Sind sie nicht identsich kommt 0 raus.

Was Du hier beschreibst, ist nicht die „AND“-Verknüpfung,
sondern ein „NOT XOR“. Die Bits müssen nicht identisch
sein, sondern sie müssen beide gleich 1 sein, damit die
AND-Operation eine „1“ ausspuckt. Bitte Unterschied
klarmachen!

Vielleicht hab ich mich falsch ausgedrückt, deswegen hab ich ein Beispiel beigefügt um irgendwelche wörtlichen Fehler auszuschließen, jenes hast du auch bemerkt.

Aus 0,0 => 0
Aus 0,1 => 0
Aus 1,0 => 0
Aus 1,1 => 1

So ist es.

if FileAttrs = sr.Attr then … = unnötig wegen „0“ und „1“

Nein, das stimmt nicht. Der Witz ist doch gerade, daß die
Variablen nicht auf die Werte „0“ und „1“ festgelegt sind,
sondern z. B. auch gleich 5 oder gleich 14 oder gleich 3476
sein können!

5 = 0000 0101
14 = 0000 1110

Schon mal was von einer Betrachtung von Zahlen im Binärsystem gehört. Darauf bezog sich nämlich meine Aussage. Anscheinend schon, wenn man sich die folgenden Aussagen ansieht.

Also würde hier nur reichen:

if FileAttrs = sr.Attr then …

Nein, es würde nicht reichen.

Z. B. ist der Wert des Booleschen Ausdrucks „107 AND 66 = 66“
gleich TRUE, aber der Wert des Booleschen Ausdrucks „107 = 66“
ist gleich FALSE.
Zur Kontrolle:

dezimal 107 = binär 01101011
dezimal 66 = binär 01000010

Nix für ungut wegen der Korrekturen…

Na gut, das stimmt. Ich habe viel zu voreilig eine Behauptung aufgestellt, die nicht stimmt.
Nur eine Korrektur. Dafür dank ich auch.

Mit freundlichem Gruß
Martin

Da schließ ich mich unvoreingenommen mit an. (Ich hoffe niemand wird diese Aussage korriegieren wollen ;Achtung: Ironie)

Mit freundlichen Grüßen
Thomas

Hi Thomas,

dann wäre das ja geklärt. Ich hatte (Tschuldigung) befürchtet, daß Du echte Verständnisschwierigkeiten mit den bitweisen Operatoren hast, aber das trifft ja nicht zu.

ist eine Bit-weise UND Verknüpfung, die folgendes macht:

Ist das x-te Bit von der ersten Variabel und das x-te Bit von
der zweiten Variabel identisch, dann kommt als Ergebnis 1
raus.
Sind sie nicht identsich kommt 0 raus.

Vielleicht hab ich mich falsch ausgedrückt,

Ja, da liegt der Hund begraben. Wenn ich hier vielleicht noch ein Stück konstruktive Kritik loswerden darf: Um solche Fehldeutungen wie die von mir zu vermeiden, hilft leider nur eins, und das ist, sich so klar wie es nur geht auszudrücken. Selbstverständlich gilt hier wie überall „nobody is perfect“, aber man sollte im Hinterkopf behalten, daß eine unpräzise Ausdruckweise erfahrungsgemäß immer die Gefahr irgendeines ärgerlichen Mißverständnisses in sich birgt.

Also besser so (oder so ähnlich) schreiben:

…ist eine Bit-weise UND Verknüpfung, die folgendes macht:

Ist das x-te Bit von der ersten Variabel und das x-te Bit von
der zweiten Variabel gesetzt, dann ist auch das x-te Bit im Ergebnis gesetzt (d. h. gleich „1“), ansonsten ist es nicht gesetzt (d. h. gleich „0“).

So, genug des (nicht böse gemeinten und nicht persönlich gegen Dich gerichteten) Senfs, den ich von mir gegeben habe :wink:.

Tschüss
Martin