Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bitweises AND (https://www.delphipraxis.net/204304-bitweises.html)

Benmik 17. Mai 2020 18:54

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?

Uwe Raabe 17. Mai 2020 19:09

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.

Benmik 17. Mai 2020 19:25

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?

DeddyH 17. Mai 2020 19:33

AW: Bitweises AND
 
https://www.delphipraxis.net/95180-e...bitmasken.html
Hilft das weiter?

Benmik 17. Mai 2020 19:52

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?

DeddyH 17. Mai 2020 19:56

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.

Benmik 17. Mai 2020 20:07

AW: Bitweises AND
 
Interessant. Danke.

Alallart 17. Mai 2020 20:28

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

1.000.000.0000011 1011 1001 1010 1100 1010 0000 0000AND
4.294.967.2951111 1111 1111 1111 1111 1111 1111 1111 
1.000.000.0000011 1011 1001 1010 1100 1010 0000 0000Ergebnis

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:

x0011 1011 1001 1010 1100 1010 0000 0000AND
x0000 0000 0000 0000 1111 1111 1111 1111 
x0000 0000 0000 0000 1100 1010 0000 0000Ergebnis

Oder anders

x0011 1011 1001 1010 1100 1010 0000 0000AND
x1111 1111 1111 1111 0000 0000 0000 0000 
x0011 1011 1001 1010 0000 0000 0000 0000Ergebnis

Oder anders

x0011 1011 1001 1010 1100 1010 0000 0000AND
x0000 0000 0000 0000 0000 0000 0000 0000 
x0000 0000 0000 0000 0000 0000 0000 0000Ergebnis

Redeemer 17. Mai 2020 21:25

AW: Bitweises AND
 
Bitoperatoren mit vorzeichenbehafteten Zahlen (wie Int64 im OP) zu verwenden ist etwas befremdlich da manchmal unintuitiv.

Rollo62 18. Mai 2020 11:06

AW: Bitweises AND
 
Zitat:

Zitat von Redeemer (Beitrag 1464746)
Bitoperatoren mit vorzeichenbehafteten Zahlen (wie Int64 im OP) zu verwenden ist etwas befremdlich da manchmal unintuitiv.

Das stimmt,
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.

Benmik 18. Mai 2020 13:00

AW: Bitweises AND
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn man neu im Thema ist, ist diese Stelle auch nützlich.

Ich habe mich schon immer gewundert, warum Datentypen mit und ohne Vorzeichen den gleichen Umfang abbilden können, da müsste doch ein Bit für das Vorzeichen abgehen? Hier und hier in Antwort #2 findet sich die Erklärung.

Nicht, dass ich sie verstanden hätte. Muss ich auch nicht, denn ich halte mich an Mafalda:

himitsu 18. Mai 2020 13:39

AW: Bitweises AND
 
Joar, binäre Operationen arbeiten nur binär, also auf den Bits und den Bits ist es egal wie sie interpretiert werden.

Es hat aber dennoch eine Auswirkung, wenn man Signed mit Unsigned mischt, vor allem wenn die beiden Werte nicht gleich groß sind.

ShortInt($FF) and LongWord($80000000) ergibt was?

Wird beim Anpassen der Bitbreite das ShortInt als Signed vergrößert, dann ergibt es LongInt($FFFFFFFF),
aber wird es Unsigned vergrößert, dann kommt LongWord($000000FF) raus,
und somit könnte, bei einem Fehler, ein anderes Ergebnis raus kommen.



https://translate.google.com/#view=h...0sabemos%208x5
?

Im Prinzip stimmt das mit dem einem Bit.
Bei Signed gibt es "quasi" das Vorzeichen an, also ob die erste Hälfte der möglichen Zahlen oder die zweite Hälfte.
Und bei Unsigned gibt das Bit im Prinzip auch an, oder die erste Hälfte oder die Zweite.

z.B. bei Signed wird im Zweierkomplement die zweite Häfte des Wertebereichs in umgekehrter Zählung für den negativen Bereich verwendet.
Es kommt halt nur drauf an, wo man den Nullpunkt setzt.
Wenn in der Mitte, dann hat man auch negative Zahlen, mit einer "einfachen" Umrechnung zwischen Negativ und Positiv.

Es gibt im Zweierkomplement also ein Bit für negativ, aber das ist "eigentlich" nicht "nur" das Vorzeichen, sondern stellt nur dar in welchem Bereich man sich bedfindet.

Bei Fließkommazahlen nach IEEE 754 ist das Signed-Bit wirklich das Vorzeichen
und ansonsten haben positive und negative Zahlen das selbe Format.

* Integer = alle Bits umdrehen und -1, um die Zahl negativ zu machen
* Float = ein Bit umdrehen, um die Zahl negativ zu machen

Da man im Zweierkomplement die Zahl 0 nicht doppelt braucht (Platzverschwendung), hat man hier im Negativen auch einen Wert mehr zur Verfügung.
Würde man den zusätzlichen Wert im positiven Bereich eingliedern, dann täte das mit dem Signed-Bit Negieren nicht mehr funktionieren.


Beim Zweierkomplement kann man beim Hochskalieren einfach das höchste Bit nehmen und dupplizieren.
ShortInt $80 = SmallInt $FF8F = Longint $FFFFFF80
ShortInt $7F = SmallInt $007F = Longint $0000007F
Und runterzu kann man auch sehr einfach prüfen, ob es passt. (neues höchtes Bit = alle höheren Bits)

Benmik 18. Mai 2020 14:43

AW: Bitweises AND
 
Ich glaube dir !! Aber ich bleibe bei Miguelito.

("Na, Miguelito, woll'n wir doch mal sehn, wieviel ist denn 8 x 9?" - "Wir, die wir unsere Grenzen kennen, wissen, wieviel 8 x 5 ist...")


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf