![]() |
Zugriff auf einzelne bits einer Variable
Hallo,
kann mir jemand verraten, wie ich auf die einzelnen Bits einer Byte-Variable zugreifen kann? In meinem Mikropascal kann ich mittels Variable[0]:=... auf einzelne Bits zugreifen, ich hab aber bisher in Delphi keine Möglichkeit dafür gefunden. Grüße Marco |
Re: Zugriff auf einzelne bits einer Variable
Ob es Funktionen gibt, weiß ich jetzt nicht.
Aber du kannst es ja mit And machen:
Delphi-Quellcode:
(Variable and 1)=1 //1. Bit
(Variable and 2)=2 //2. Bit (Variable and 4)=4 //3. Bit (Variable and 8)=8 //4. Bit ... (Variable and 128)=128 |
Re: Zugriff auf einzelne bits einer Variable
Was genau willst du machen?
ps: Es gibt die Möglichkeit die Bits über ein Set abzubilden, sie über Operatoren zu lesen/manipulieren, oder die Klasse TBits zu verwenden... edit: "(Variable and 8) = 8" ist langsamer als "(Variable and 8) <> 0".
Delphi-Quellcode:
type
PByteBit = ^TByteBit; TByteBit = (bBit0, bBit1, bBit2, bBit3, bBit4, bBit5, bBit6, bBit7); PByteBits = ^TByteBits; TByteBits = set of TByteBit; function TestBit(ABits: TByteBits; ABit: TByteBit): Boolean; {$IFDEF SUPPORTS_INLINE} inline; {$ENDIF} begin Result := ABit in ABits; end; procedure Foo(); var Bar: Byte; begin Bar := 42; if TestBit(TByteBits(Bar), bBit1) then ShowMessage('Hello, World!'); end; |
Re: Zugriff auf einzelne bits einer Variable
Cool, dankeschön!
Das reicht mir schon. Grüße Marco |
Re: Zugriff auf einzelne bits einer Variable
Ich arbeite an einer Programmiersoftware für Mikrocontroller.
Der Controller hat 3 8-bit breite Konfigurationsregister, die ich auslese. Ich habe für jedes Bit eine Checkbox, die je nach Zustand des Bits makiert sein soll, oder eben nicht. |
Re: Zugriff auf einzelne bits einer Variable
Wenn man den Leitungen (Bits) Namen geben kann, dann würde ich immer die Abbildung über ein Set bevorzugen.
(allerdings bedürfen die Set-Operationen erstmal einer gewissen Einarbeitungszeit auf Entwicklerseite) Es gibt viele Wege nach Rom - ist nur die Frage, wieviel man von der Landschaft sehen will :) ps: Für eine konkrete Empfehlung bräuchte man u.a. die Delphi-Version und möglicherweise mehr Informationen. |
Re: Zugriff auf einzelne bits einer Variable
Zitat:
Denn so ist es intern ähnlich wie "if (Boolean-Variable <> FALSE) |
Re: Zugriff auf einzelne bits einer Variable
Mein Gott ist das kompliziert...
Ich habe Delphi 6 Pro. Dein Beispiel mit TestBit funktioniert schonmal super, wenn du mir jetzt noch verrätst, wie ich ein bit setzen kann, währe ich dir sehr dankbar! Gruß Marco |
Re: Zugriff auf einzelne bits einer Variable
ich glaub du solltest dir mal ein Tutorial bezüglich bitoperationen anschauen. Wenn du mit Microcontrollern arbeitest schadet es auf keinen Fall wenn du weißt was auf Bitebene passiert.
|
Re: Zugriff auf einzelne bits einer Variable
Beim Mikrocontroller kann ich ohne Weiteres auf jedes Bit zugreifen,
nur unter Delphi ist das nicht so einfach. |
Re: Zugriff auf einzelne bits einer Variable
auf bits zugreifen ist was anderes als zu verstehen was bei operationen mit den bits passiert. Wenn du "variable1 + variable2" ausführst wird eine binäre operation ausgeführt und wenn du diese operationen verstehst dann weißt du auch wie man üblicherweise bits manipuliert. Auch bei "if (ausdruck1 or ausdruck2)" wird eine bitoperation ausgeführt wo letztendlich dann die bits anders stehen. Das zu verstehen sollte bei der Arbeit mit Microcontrollern nicht schaden. Denn wenn du das weißt, weißt du auch wo du mit Optimierungen anfangen kannst. Ein Bits setzen geht übrigens mit or.
Variable1: 010000 Variable2: 000010 mit or verknüpft: Variable3: 010010 Wenn also das eine bit oder das andere gesetzt ist wird es auch beim ergebnis gesetzt.
Delphi-Quellcode:
function setbit(variable: Integer; bitindex: Byte): Integer;
begin result := variable or (1 shl bitindex); end; |
Re: Zugriff auf einzelne bits einer Variable
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
ps: man kann auch ".." verwenden um Bit-Bereiche anzugeben: [bBit0..bBit3, bBit7] sind die ersten vier Bits und das höherwertigste Bit ($8F).
var
Foo: TByteBits; begin Foo := [bBit1, bBit3, bBit5]; ShowMessage(IntToStr(Byte(Foo))); Include(Foo, bBit0); Include(Foo, bBit2); Exclude(Foo, bBit1); Exclude(Foo, bBit3); ShowMessage(IntToStr(Byte(Foo))); Foo := Foo - [bBit0, bBit2] + [bBit1, bBit3]; ShowMessage(IntToStr(Byte(Foo))); end; |
Re: Zugriff auf einzelne bits einer Variable
Zitat:
denn wenn das bit schon gesetzt ist kommt totaler müll dabei raus. /Edit: Wie es sich bei sets verhält weiß ich nicht. Aber man sollte sich sowas gar nicht erst angewöhnen bei bitoperationen mit + und minus zu arbeiten. |
Re: Zugriff auf einzelne bits einer Variable
Zitat:
...der Compiler macht mit den Bits(-Sets) genau das was man erwartet - nur mit dem Unterschied, dass man den Code noch lesen kann und die Optimierung dem Compiler überlassen bleibt. (Ich weiß was ich tue - nicht immer, aber oft genug) |
Re: Zugriff auf einzelne bits einer Variable
hmm, komisches verhalten. Eigentlich hatte ich erwartet das bei der Verwendung von "+" also bei einer Addition etwas dazu kommt und nicht das nichts passiert wenn ich etwas addiere.
|
Re: Zugriff auf einzelne bits einer Variable
Zitat:
Es gibt noch andere Operatoren für Sets (<=, >=, *, ...) - damit könnte man sich in diesem Beispiel sämtliche binären Operatoren sparen (die man spätestens nach zwei Wochen, trotz Quelltext, nur noch mühsam lesen/verstehen kann). |
Re: Zugriff auf einzelne bits einer Variable
* / etc sind entsprechend auch anders definiert für Mengen. Damit bekommt man dann halt die Schnittmenge, etc.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 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-2025 by Thomas Breitkreuz