Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zugriff auf einzelne bits einer Variable (https://www.delphipraxis.net/112110-zugriff-auf-einzelne-bits-einer-variable.html)

earlyperl 15. Apr 2008 10:28


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

sirius 15. Apr 2008 10:41

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

nicodex 15. Apr 2008 10:45

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;

earlyperl 15. Apr 2008 10:45

Re: Zugriff auf einzelne bits einer Variable
 
Cool, dankeschön!
Das reicht mir schon.

Grüße
Marco

earlyperl 15. Apr 2008 11:03

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.

nicodex 15. Apr 2008 11:07

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.

SirThornberry 15. Apr 2008 11:12

Re: Zugriff auf einzelne bits einer Variable
 
Zitat:

"(Variable and 8) = 8" ist langsamer als "(Variable and 8) <> 0".
oder gleich nach bool casten :wink:
Denn so ist es intern ähnlich wie "if (Boolean-Variable <> FALSE)

earlyperl 15. Apr 2008 11:15

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

SirThornberry 15. Apr 2008 11:18

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.

earlyperl 15. Apr 2008 11:20

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.

SirThornberry 15. Apr 2008 11:27

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;

nicodex 15. Apr 2008 11:30

Re: Zugriff auf einzelne bits einer Variable
 
Zitat:

Zitat von earlyperl
Mein Gott ist das kompliziert...

Nö, nur anders ;)

Zitat:

Zitat von earlyperl
Ich habe Delphi 6 Pro.

Schade, in aktuellen Delphi-Versionen hätte man den Array-Operator für Bits (so wie im MC-Pascal) nachbilden können.

Zitat:

Zitat von earlyperl
wenn du mir jetzt noch verrätst, wie ich ein bit setzen kann, währe ich dir sehr dankbar!

Include/Exclude für einzelne Bits, oder +/- für mehrere:
Delphi-Quellcode:
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;
ps: man kann auch ".." verwenden um Bit-Bereiche anzugeben: [bBit0..bBit3, bBit7] sind die ersten vier Bits und das höherwertigste Bit ($8F).

SirThornberry 15. Apr 2008 11:34

Re: Zugriff auf einzelne bits einer Variable
 
Zitat:

Include/Exclude für einzelne Bits, oder +/- für mehrere:
:shock: NIEMALS!
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.

nicodex 15. Apr 2008 11:39

Re: Zugriff auf einzelne bits einer Variable
 
Zitat:

Zitat von SirThornberry
/Edit: Wie es sich bei sets verhält weiß ich nicht.

Das sind Sets...
...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)

SirThornberry 15. Apr 2008 11:50

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.

nicodex 15. Apr 2008 12:05

Re: Zugriff auf einzelne bits einer Variable
 
Zitat:

Zitat von SirThornberry
hmm, komisches verhalten.

Sets haben halt ein eigenes Operatorenverhalten (welches für Sets durchaus sinnvoll ist).
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).

Muetze1 15. Apr 2008 12:06

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 14:35 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