Delphi-PRAXiS
Seite 1 von 2  1 2      

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

Z4ppy 19. Nov 2008 17:30


Bits auslesen?
 
Ich will aus einem Daten-Byte (das aus einem String oder einem Stream stammt) die einzelnen Bits auslesen. Danach möchte ich mit ihnen weiterrechnen ;) Nun hab ich dazu aber einige Fragen :D

1. Wie les ich die Bits aus? Ich hab zwar dieses Thema gefunden, aber das hat mir nicht sonderlich weitergeholfen :oops:
2. Wie speicher ich die Bits am besten ab? Ich benötige sämtliche 8 Bits (getrennt), da ich mit ihnen unterschiedlich weiterrechnen will...
Weitere Fragen folgen evtl. :D

MfG Z4ppy

PS.: Bitte fragt jetzt nicht nach, was ich am Schluss machen will ;) Auf jeden Fall brauch ich für mein Projekt die einzelnen Bits - basta!

DeddyH 19. Nov 2008 17:34

Re: Bits auslesen?
 
Tut mir Leid, dass Du mein Tut nicht verstanden hast. Aber was genau meinst Du mit "Bits auslesen"? Willst Du gezielt nachsehen, ob ein bestimmtes Bit gesetzt ist? Das geht mit dem "bitweisen und", in Delphi also AND.
Beispiel:
Delphi-Quellcode:
if (Zahl and 16) = 16 then //Bit ist gesetzt

SirThornberry 19. Nov 2008 17:36

Re: Bits auslesen?
 
Die Frage die sich mir stellt ist, ob es etwas bringt die einen Quelltext zu zeigen der bits setzt und ausliest. Oder ist es besser dir die Bitoperatoren zu erklären damit du auch verstehst wie das ganze funktioniert.
Weißt du Beispielsweise welche Bits bei der Zahl 182 gesetzt sind (bzw. wie man das durch rechnen heraus findet)? Also weißt du generell wie sich der Wert eines Byte aus den einzelnen Bits zusammensetzt und welche Wertigkeit dabei die entsprechenden bits haben? Und weißt du in diesem Zusammenhang warum in 1 Byte nur eine Zahl bis maximal 255 passt (unsigned)?
All das wäre interessant um zu wissen ab wo es sinnvoll ist anfzufangen mit der Erklärung :-)

Z4ppy 19. Nov 2008 17:47

Re: Bits auslesen?
 
@Deddy:Ja genau, ich will im Prinzip wissen, ob ein Bit eine 0 oder eine 1 enthält, bzw. welche Bits gesetzt sind ;)
Für das hinterste Bit könnte man auch den Code nehmen, oder? (Wenn ja, dann hab ich dein Tut ja doch verstanden :D)
Delphi-Quellcode:
if(Zahl and (1 shl 0)=(1 shl 0)) then //hinterstes bit gesetzt
Dann könnte man das nämlich durch ne schöne Schleife sausen lassen und hätte gleich alle Bits :D

@SirThornberry: Ja, ich weiss, was die einzelnen Bit-Operationen (or, and, xor) machen und ich kenne auch die Wertigkeit der einzelnen Bits ;)
182 müsste etwa dem Bit 10110110 entsprechen, oder? (also 128 + 32 + 16 + 4 + 2)

MfG Z4ppy

DeddyH 19. Nov 2008 17:51

Re: Bits auslesen?
 
Damit hast Du doch im Prinzip Deinen Lösungsweg ;)

Z4ppy 19. Nov 2008 17:54

Re: Bits auslesen?
 
Danke für deine Hilfe :thumb: Dann hab ich ja doch noch was von deinem Tut verstanden :lol:

MfG Z4ppy

SirThornberry 19. Nov 2008 19:19

Re: Bits auslesen?
 
wenn man immer nur eine 1 shiftet und diese mit einem logischen und verknüpft reicht es auf ungleich 0 zu prüfen. Denn entweder dieses 1 bit ist gesetzt oder keines (denn die 1 ist ein einzelnes bit und wenn man dieses shiftet bleibt auch weiterhin nur 1 bit gesetzt welches dann entweder gesetzt ist (ungleich 0) oder eben nicht gesetzt ist (gleich 0)).

DeddyH 19. Nov 2008 19:24

Re: Bits auslesen?
 
Es spricht aber auch nichts dagegen, gegen Konstanten zu prüfen.

nicodex 20. Nov 2008 08:10

Re: Bits auslesen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Da ich sowas öfter brauche (Datenanalyse), habe ich mir inzwischen Hilfstypen und -funktionen geschrieben, um die Arbeit mit Sets/Bits/Flags zu vereinfachen (und den Quelltext lesbarer zu halten). Anbei eine Unit für Delphi und FreePascal.

Richtig angenehm wird die Verwendung der TSetX-KlassenStrukturen erst ab BDS2006 (Funktionen und Operatoren für Strukturen). Für ältere Delphi-Version bleibt nur TSetX_Get/SetBit (bei Delphi-Versionen die "inline" unterstützen, gibt’s trotz Lesbarkeit kaum Performancenachteile).

alzaimar 20. Nov 2008 08:43

Re: Bits auslesen?
 
Nicht schlecht, aber ein wenig viel Code, finde ich.
Ich prüfe Bits so:
Delphi-Quellcode:
Const
  ccMyBit7Status = $0070;
  ccMyBit34Status = $0018;

...
Begin
  If FullStatusWord and ccMyBit7Status <> 0 then .... // Bit 7 gesetzt
  If FullStatusWord and ccMyBit34Status <> 0 Then .... // Bit 3 oder 4 gesetzt
  If FullStatusWord and ccMyBit34Status = ccMyBit34Status Then .... // Bit 3 und 4 gesetzt

//  Oder so
  If FullStatusWord and (1 shl 7) <> 0 then ...
...
Wenn Du Dir den VCL-Quellcode anschaust, wird das auch eigentlich immer so gemacht: Man definiert sich seine Bitkonstanten so, das sie schön leserlich sind (ich packe immer ein 'cc' vor so eine Konstante, frag mich nicht wieso) und prüft dann über eine Maskierung.

Wenn man unbedingt will, kann man die Abfrage bzw. das Setzen noch in Routinen packen und so kapseln, oder gleich eine Klasse draus basteln und die Methoden als Class Function (bzw. Procedure) deklarieren.

Ich sehe aber nicht so viel Sinn darin, eine einfache Maskierung und abfrage noch zu kapseln.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:59 Uhr.
Seite 1 von 2  1 2      

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