![]() |
Bits
Hi,
ich habe ein Prblem mit Bits. Ich weiß nicht so genau, wie man rausfinden kann, ob ein Bit gesetzt ist oder nicht. Vieleicht kennt jemand ein gutes Tut über soetwas. Thx & Mfg |
Re: Bits
Delphi-Quellcode:
Sollte so gehen...
function TestBit(Value : byte; bit : byte) : boolean;
begin if (Value AND (1 shl bit )) = (1 shl bit) then result := true else result := false; end; Ansonsten guck dir mal die Befehle "AND", "OR", "NOT" an... |
Re: Bits
Danke Nightshade.
das werde ich gleich ausprobieren. Die Befehle "AND", "OR", "NOT", etc kenne ich. Habe ich schon in abfragen benutzt. Ich wusste nur nicht, wie die als Bit-Abfrage benutz werden. |
Re: Bits
ginge es nich auch kürzer so?
Delphi-Quellcode:
ich hätte es jetzt spontan so gemacht:
function TestBit(Value : byte; bit : byte) : boolean;
begin result:=(Value AND (1 shl bit )) = (1 shl bit); end;
Delphi-Quellcode:
function TestBit(Value : byte; bit : byte) : boolean;
begin result:=(Value and (1 shl bit))<>0; end; |
Re: Bits
So wie Nightshade es im Beispiel gezeigt hat, habe ich es nicht hinbekommen. Ich habe es jetzt nachdem ich ein Beispiel hatt so gemacht:
Delphi-Quellcode:
Jetzt hat sich mir ncoh eine Frage gestellt, weiß jemand, wie ich eine Konstante gleich Binär angeben kann? Bei Hexadezimal weiß ich es, aber nicht binär;
function TestBit(Value : byte; bit : byte) : boolean;
begin result := ((Value AND bit) = bit)); end; |
Re: Bits
das kann so aber net funzen, oder?
hast du das mal getestet? |
Re: Bits
Ja das habe ich so getestet läuft ohne Probleme.
|
Re: Bits
nein, es ist falsch!!!
ich hab 2er potenzen eingegeben -> genau 1 bit true es müsste so sein: 1 1 2 2 4 3 8 4 16 5 32 6 es ist aber laut deiner procedure so: 1 1 2 2 4 4 8 8 16 16 |
Re: Bits
Okya, um das ganze etwas einfacher zu machen:
Delphi-Quellcode:
Beispiel:
function BitSet(Value: Byte; BitCnt: Byte): Boolean;
begin Result := (( Value AND Round ( power (2, BitCnt-1) )) = Round ( power (2, BitCnt-1) )); end;
Delphi-Quellcode:
if BitSet (24, 5) then // TestBit (00011000, 00010000)
if BitSet (24, 4) then // TestBit (00011000, 00001000)
ShowMessage ('Ja!'); ShowMessage ('Ja!');[/delphi] |
Re: Bits
aber das is so lang :(
das funzt:
Delphi-Quellcode:
function TestBit(Value : byte; bit : byte) : boolean;
begin result:=(Value AND (1 shl bit )) = (1 shl bit); end; |
Re: Bits
Moin Rangarig,
Zitat:
Zitat:
Delphi-Quellcode:
einen Präfix für Binärdarstellung wie $ bei Hexadezimal gibt es in Delphi (leider) nicht.
const
Acht = 1 shl 3; |
Re: Bits
geht auch so
Delphi-Quellcode:
geht aber nur mit 8 bit glaub ich. Ausprobieren. ansonsten kannst dir ja au
containsbits := Boolean(Wert AND Bitmaske);
Delphi-Quellcode:
definieren und prüfen mit
const
bit00 = $0001; bit01 = $0002; bit02 = $0004; bit03 = $0008; bit04 = $0010; bit05 = $0020; bit06 = $0040; bit07 = $0080; ... bit31 = $8000;
Delphi-Quellcode:
containsbit := (wert and bit12)<>0;
|
Re: Bits
aber dann musst du immer in hex umrechnen....
|
Re: Bits
nicht die schnellste variante aber sie funzt (nehm ich immer)
Delphi-Quellcode:
type
TBitIndex = Byte; function SetBit(const AByte: Int64; const ANewBitStatus: Boolean; const ABitIndex: TBitIndex): Int64; begin if ANewBitStatus then result := AByte or (1 shl ABitIndex) else result := AByte and not(1 shl ABitIndex); end; function GetBit(const AByte: Int64; const ABitIndex: TBitIndex): Boolean; begin result := AByte = SetBit(AByte, True, ABitIndex); end; |
Re: Bits
ich versteh da nur bahnhof... :gruebel:
kannst du das event. ma kurz erläutern? was is TBitIndex? |
Re: Bits
Sorry, hab nicht gesehen das ich da nen extra typen verwendet hab. (ist jetz im editierten Beitrag mit drin). TBitIndex gibt an um das wievielte Bit es sich handelt und ist nix anderes als ein Byte.
Ich habs als TBitindex definiert falls ich den Type später noch ändern will (dann brauch ich nur die Typdeclaration ändern und musst das nicht bei allen Proceduren ändern) |
Re: Bits
Dein Funktion glkgereon:
Zitat:
Das zu prüfende Byte habe ich wie folgt aufgebaut
Delphi-Quellcode:
Vieleicht habe ich hier aber auch schon einen Fehler gemacht. TestBit2 ist Funktion, wie [quote="glkgereon"] sie gezeigt hat.
.
. . const V1 : byte = 1 shl 0; V2 : byte = 1 shl 1; V3 : byte = 1 shl 2; . . . procedure TForm1.Button1Click(Sender: TObject); begin V := V xor V1; Flags_Aendern; end; . . . procedure TForm1.Flags_Aendern; var b : byte; begin CheckBox1.Checked := TestBit(V, V1); CheckBox4.Checked := TestBit2(V, V1); CheckBox2.Checked := TestBit(V, V2); CheckBox5.Checked := TestBit2(V, V2); CheckBox3.Checked := TestBit(V, V3); CheckBox6.Checked := TestBit2(V, V3); end; . . . function TForm1.TestBit(Value : byte; bit : byte) : boolean; begin result := ((Value AND bit) = bit); end; Wenn ich die 0. 2er Potenz (sprich das 1.Bit) nachschauen möchte ob es gesetzt ist mache ich das nach Folgender Gleichung auf den Papier: 00000001 -> zu Prüfende Byte (Value) 00000001 AND -> Prüf Byte (bit) ________ 00000001 -> Ergebnis (result) bzw.: 00000000 -> zu Prüfende Byte (Value) 00000001 AND -> Prüf Byte (bit) ________ 00000000 -> Ergebnis (result) (Beispiel mit 8 Bits) Zumindest habe ich das in der Berufsschule so gelernt. |
Re: Bits
sry, mir ist vorhin beim Fernsehen :idea: aufgefallen, das Eure Funktionen nur ein Bit überprüft, ob es auf 1 gesetzt ist bzw. ob nicht. Ich übergebe meiner Funktion aber eine Maske.
|
Re: Bits
Moin René,
Zitat:
Die Funktion sollte dann aber besser TestBits heissen, denn es werden ja mehrere Bits gleichzeitig geprüft. |
Re: Bits
Mahlzeit Christian,
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 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