![]() |
Delphi-Version: 10.3 Rio
Bitweises AND
In einer Unit findet sich folgender Code:
Delphi-Quellcode:
.
lBaseRecord := (PInt64(@fr[$20])^) and $0000FFFFFFFFFFFF;
Ich weiß, was auf Bitebene passiert und ich weiß auch, dass man mit einem bitweisen AND prüfen kann, ob ein bestimmtes Bit gesetzt ist. Aber kann jemand mir mal erklären, wozu das eigentlich gut ist? Was macht diese Codezeile mit BaseRecord (einem Int64)? Was erreicht man damit, wann setzt man sowas ein? |
AW: Bitweises AND
Es setzt die oberen 16 Bit des 64-Bit Werts auf 0. Warum das da gemacht wird kann ich dir ohne Kontext auch nicht sagen.
|
AW: Bitweises AND
Ah, das bringt schon etwas Licht. (Das konkrete Beispiel ist mir nicht wichtig). Aber was passiert mit den unteren 48 Bit? 00 ist 0, das verstehe ich. Aber ist FF dann 1, oder jedenfalls nicht 0? Müsste das die Bits von lBaseRecord beim Vergleich mit FF nicht auch ändern, je nachdem, ob dort 00 oder nicht 00 steht?
|
AW: Bitweises AND
|
AW: Bitweises AND
Das ist eine sehr schöne Anleitung! Dauert vermutlich etwas, bis das in die tieferen Synapsenschichten sinkt.
Also ist es so: Die oberen 16 Bit werden alle auf 0 gesetzt, weil der Vergleich mit 0 immer 0 ergibt. Die unteren werden auf 1 gesetzt, wenn sie 1 sind und auf 0, wenn sie 0 sind. Das könnte eventuell dazu führen, dass sie schlicht gleich bleiben, was so ziemlich das ist, was Uwe geschrieben hat. Cool. Benutzt man bitweises AND eigentlich in der Regel, um Flags auszulesen, oder gibt es (mal abgesehen vom vorliegenden Beispiel) noch eine häufiger gebrauchte Verwendung? |
AW: Bitweises AND
Einerseits wird das gern bei Flags genutzt, andererseits auch in der Netzwerktechnik, z.B. um zu ermitteln, ob sich 2 Rechner im selben Netzwerksegment befinden, zumindest bei IPv4.
|
AW: Bitweises AND
Interessant. Danke.
|
AW: Bitweises AND
Man möge mich verbessern wenn ich deine Frage falsch verstanden habe...
Nehmen wir an wir haben den Wert 1.000.000.000 und AND'en ihn mit einer anderen Zahl
Ergebnis ist, dass nur da wo die Bits 1 und 1 sind, Ergebnis 1 ist. Wo 1 und 0 sind, ist das Ergebnis 0. Vielleicht ist das Beispiel oben zu langweilig:
Oder anders
Oder anders
|
AW: Bitweises AND
Bitoperatoren mit vorzeichenbehafteten Zahlen (wie Int64 im OP) zu verwenden ist etwas befremdlich da manchmal unintuitiv.
|
AW: Bitweises AND
Zitat:
aber die Bits sind ja erstmal gleich für Int64 und UInt64. Der Bit-Operation sollte das erstmal egal sein. Erst nach der Bit-Operation wird die Bewertung (Signed/Unsigned) gemacht, und da könnte man schonmal logisch leicht daneben liegen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz