Moin!
Zitat von
Capable:
was du mir sagen willst ist, dass ich
$16 in $10
$32 in $20
$64 in $40
$128 in $80
abändern soll, oder?
Ganz genau - es wurden die richtigen Zahlen genommen, aber leider wurden sie mit dem $ davor zu hexadezimalzahlen und damit wieder falsch.
IF Value AND $01 = $01 then ShowMessage('Pin 1 ist gesetzt: Databit 0');
Der Wert Value beinhaltet ein Wert und dieser wird durch die unterschiedlichen Bits dargestellt. Um abzufragen ob einzelne Bits gesetzt sind oder nicht maskiert man sie aus. Dies geschieht durch eine binäre UND Verknüpfung. Dabei verknüpft man den Wert mit einer Maske. Bei einer UND Verknüpfung ist es so, dass nur die Bits gesetzt bleiben die auch in der Maske gesetzt sind - alle anderen werden auf 0 gesetzt. Und wenn nun in deinem Value das Bit 0 und Bit 1 gesetzt ist (Value = 3) und du eine UND Verknüpfung mit einem gesetzten Bit 0 und Bit 2 machst (5), dann wird Bit 0 und Bit 2 unverändert gelassen bei dem Wert und alle anderen Bits werden auf 0 gesetzt. Somit kannst du danach abfragen ob das Ergebnis <> 0 ist, was dann bedeutet das entweder Bit 0 oder Bit 2 gesetzt ist - oder beide.
Delphi-Quellcode:
0000 0001b
AND 0000 0001b
= 0000 0001b
0101 0101b
AND 1100 0011b
= 0100 0001b
Im Ergebnis sind immer nur die Bits gesetzt die in beiden Werten gesetzt sind - Wert und Maske. Daher auch UND ...
Die obige Abfrage in Delphi macht folgendes: Sie führt eine binäre UND-Verknüpfung mit dem Wert aus und einer Maske wo nur Bit 0 gesetzt ist. Danach fragt sie ab, ob das Ergebnis dieser Verknüpfung ein Wert mit gesetztem 0. Bit ist - alle anderen Bits können nicht mehr gesetzt sein. So gehen alle anderen IF Anweisungen auch vor - sie führen diese UND Verknüpfung durch - nacheinander für Bit 0, Bit 1, Bit 2, Bit 3, Bit 4, etc
@flomei:
Zitat von
Muetze1:
@flomei:
Erklär mal bitte auch, das es eine Basisadresse gibt und dann die Register immer nur ein fester Offset von dieser Basisadresse ist.
Und bitte die Bit Abfrage korrigieren, also nicht
If ( Value And $64 ) = $64 Then
sondern
If ( Value And 64 ) = 64 Then
oder die richtigen Hexadezimalwerte dafür nutzen ($01, $02, $04, $08, $10, $20, $40, $80).
MfG
Muetze1