Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bits eines Bytes auslesen (https://www.delphipraxis.net/1134-bits-eines-bytes-auslesen.html)

Salomon 22. Okt 2002 15:58


Bits eines Bytes auslesen
 
Hallo,
nachdem ich das Wochenende über nicht da war, geht es jetzt weiter in der Welt der Bits und Bytes.

Für meine Relaiskarte fehlt mir noch eine Prozedur mit der ich abfragen kann ob ein Relais eingeschaltet ist oder nicht.

Dazu muss ich in dem Status Byte, das ich von der Relaiskarte bekomme abfragen, ob das Bit an Stelle x 1 oder 0 ist. Wie mache ich das?

Mfg
Salomon

d3g 22. Okt 2002 16:17

Hi Salomon,

ich weiß nicht, hate das sakura nicht scho irgendwo gepostet?

Code:
function TestBit(aByte: Byte; aBitNum: Integer): Boolean;
begin
  Result := (aByte and (1 shl aBitNum)) > 0;
end;
Das niedrigste Bit hat die Nummer 0, das höchste die Nummer 7. Wenn das Bit gesetzt ist, dann wird True zurückgegeben sonst False.

Das Prinzip ist, dass man das Byte mit einem anderen Byte, in dem nur das zu testende Bit gesetzt ist, and-verknüpft. Beispielsweise soll das 6. Bit überprüft werden:

Bit gesetzt:
Code:
    x1xxxxxx
and 01000000
------------
    01000000
Bit nicht gesetzt:
Code:
    x0xxxxxx
and 01000000
------------
    00000000
Die anderen Stellen (die mit x markiert sind) sind egal, da immer gilt: x and 0 = 0. Das zweite Byte wird durch eine shl-Operatein erzeugt. Ausgegeangen wird vom Byte 00000001. Die 1 wird dann um die gewünschte Anzahl stellen mit shl nach links verschoben.

MfG,
d3g

Salomon 22. Okt 2002 16:24

Danke, werde ich gleich mal ausprobieren.
Sakura hatte mir ein Quick Tutorial über die Bitweisen Operatoren gepostet. Wie ich die einzelnen Bits setze ist mir klar, nur auf das abfragen bin ich eben nicht gekommen.

Salomon 22. Okt 2002 20:41

Eine Grundlegende Frage habe ich noch. Wenn ich folgendes schreibe:
Code:
Var n : byte;
begin
n := 1;
end;
Dann nehmen doch die einzelnen Bits den Binärwert von 1 auf oder?

Daniel B 22. Okt 2002 20:48

Zitat:

Zitat von Salomon
Code:
Var n : byte;
begin
n := 1;
end;
Dann nehmen doch die einzelnen Bits den Binärwert von 1 auf oder?

Hi,

ja, was sollten sie denn auch sonst machen? Da die Bits nicht getoggelt werden, bleibt ja gar nichts mehr anderes übrig.

Grüsse, Daniel :hi:

Christian Seehase 22. Okt 2002 21:01

Moin Salomon,

nein, in Deinem Beispiel wird Bit 0 auf 1 gesetzt, die übrigen auf 0.

[EDIT]Vergiss die vorige Zeile, Missverständnis :oops: [/EDIT]

Ein Byte hat den Wertebereich (dezimal) von 0 bis 255, (binär) 00000000 bis 11111111.

Die Bits werden von rechts nach links mit 0 bis 7 durchnummeriert. Die Position ist also als Exponent für 2 zu verwenden, um den dezimalen Wert eines Bits herauszubekommen (2 hoch 0 = 1, 2 hoch 1 = 2 usw.).

Mal abgesehen davon, dass man sich mit IntToStr den dezimalen Wert ganz einfach anzeigen lassen kann, kann man also, allgemein, den Dezimalwert einer Binärzahl durch Addition der Produkte aus dem Wert der Stelle (0 oder 1) und dem Ergebnis der Potenz (2 hoch n) errechnen.

Beispiel:

10110001

1 * 2^7 = 128
0 * 2^6 = 0
1 * 2^5 = 32
1 * 2^4 = 16
0 * 2^3 = 0
0 * 2^2 = 0
0 * 2^1 = 0
1 * 2^0 = 1
--------------
= 177
===


Mit folgenden Funktionen kannst Du, wenn ich mich jetzt nicht vertan habe, gezielt einzelne Bits setzen, bzw. löschen können.

Code:
[b]function[/b] SetBit([b]var[/b] p_bResult : Byte;[b]const[/b] p_iPosition : integer) : Boolean;

[b]begin[/b]
  Result := (p_iPosition < 8);
  [b]if[/b] [b]not[/b] Result [b]then[/b]
  [b]begin[/b]
    exit
  [b]end[/b];
  p_bResult := p_bResult [b]or[/b] (1 [b]shl[/b] p_iPosition);
[b]end[/b];

[b]function[/b] ClearBit([b]var[/b] p_bResult : Byte;[b]const[/b] p_iPosition : integer) : Boolean;

[b]begin[/b]
  Result := (p_iPosition < 8);
  [b]if[/b] [b]not[/b] Result [b]then[/b]
  [b]begin[/b]
    exit
  [b]end[/b];
  p_bResult := p_bResult [b]and[/b] [b]not[/b]( (1 [b]shl[/b] p_iPosition));
[b]end[/b];

Daniel B 22. Okt 2002 21:16

Hallo Christian und Salomon,

uuups, :oops: kann ja gar nicht sein. Wenn man sich das n:=1 in einer Message anzeigen lassen würde, würde auch wieder ne 1 rauskommen, würden alle Bits auf 1 sein, würde ja 255 rauskommen.
Sorry.

Grüsse, Daniel :hi:

Christian Seehase 22. Okt 2002 21:25

Moin Daniel B,

wieso Du hattest doch recht. Da lag ja mein Missverständnis ;-)

Die Bits nehmen den Binärwert von 1 an, nämlich 00000001.

Ich hatte es erst so verstanden, wie Du wohl im Nachhinein :mrgreen:, dass die Bits alle den Wert ein annehmen, aber das hatte Salomon ja nicht geschrieben.

Salomon 22. Okt 2002 22:51

Kurz gesagt, ich lag richtig :mrgreen:
@Christian Seehase: Danke für die Ausführliche Erklärung, ich denke langsam habe ich es drauf mit den Bits und Bytes.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:20 Uhr.

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