AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bits eines Bytes auslesen

Ein Thema von Salomon · begonnen am 22. Okt 2002 · letzter Beitrag vom 22. Okt 2002
Antwort Antwort
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#1

Bits eines Bytes auslesen

  Alt 22. Okt 2002, 16:58
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
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#2
  Alt 22. Okt 2002, 17: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
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#3
  Alt 22. Okt 2002, 17: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.
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#4
  Alt 22. Okt 2002, 21: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?
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#5
  Alt 22. Okt 2002, 21:48
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 22. Okt 2002, 22:01
Moin Salomon,

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

[EDIT]Vergiss die vorige Zeile, Missverständnis [/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];
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#7
  Alt 22. Okt 2002, 22:16
Hallo Christian und Salomon,

uuups, 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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#8
  Alt 22. Okt 2002, 22: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 , dass die Bits alle den Wert ein annehmen, aber das hatte Salomon ja nicht geschrieben.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#9
  Alt 22. Okt 2002, 23:51
Kurz gesagt, ich lag richtig
@Christian Seehase: Danke für die Ausführliche Erklärung, ich denke langsam habe ich es drauf mit den Bits und Bytes.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:30 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