![]() |
Welches Bit in einer Zahl ist gesetzt
Kurze Frage:
Wie kann ich mit Delphi ermitteln, ob das 1., 2. oder 15. Bit einer Zahl 1 ist? Danke |
Re: Welches Bit in einer Zahl ist gesetzt
Hol dir die JCL. In JclLogic.pas sind ein Funktionen zur Bithandhabung.
|
Re: Welches Bit in einer Zahl ist gesetzt
Delphi-Quellcode:
function IsBit(n,x:Integer):Boolean;//n ist die Zahl x das Bit
Begin Result:=(n mod (x*2))>=x; end; |
Re: Welches Bit in einer Zahl ist gesetzt
ansonsten z.B. auch so:
Delphi-Quellcode:
if Zahl and trunc(Power(2,15)) > 0 then Bit15_ist_gesetzt
|
Re: Welches Bit in einer Zahl ist gesetzt
Och Leute ;)
Delphi-Quellcode:
function IsSet(I, Bit: Integer): Boolean;
begin Result := I and (1 shl Bit) <> 0; end; |
Re: Welches Bit in einer Zahl ist gesetzt
Zitat:
Zitat:
diese Lösung funktioniert aber nur bei ganzen Zahlen (Integer). :mrgreen: Wie sieht es aber bei Kommazahlen (z.B. Single = 4 Byte) aus? Wie sind die Bits der Mantisse im Speicher? Ich habe hier mal ein kleines Codeschnippsel gepostet um sich das anzuscheuen. Einfach 3 Edit Felder (Edit1, Edit2 und Edit3) und einen Button auf ein Form plazieren und in die onClick Methode des Buttons den Quelltext (siehe Link) einfügen. ![]() In Edit1 eine Zahl (z.B: 1,5) eingeben und den Button drücken. In Edit2 wird der Speicherinhalt hexadezimal ausgegeben. In Edit3 wird der Speicherinhalt binär ausgegeben. Viel Spaß MaBuSE @smudo: Falls Deine Frage beantwortet ist, nicht vergessen mit dem http://www.delphipraxis.net/template...t_answered.gif - Button oben auf der Seite die Frage als beantwortet zu markieren. Danke |
Re: Welches Bit in einer Zahl ist gesetzt
Also TStringList dafuer ist aber eine Bastonade angemessen.
Floats fuer die Bitbehandlung. :kopfschuettel: |
Re: Welches Bit in einer Zahl ist gesetzt
Zitat:
(z.B. String, Array, eigene Typen) Man muss nur den belegten Speicher anpassen und fertig. Das Beispiel zeigt außerdem wie man mit Hilfe eines Case im Record Speicher überladen kann. |
Re: Welches Bit in einer Zahl ist gesetzt
das einfachste währe wohl einfach einer funktion einen pointer auf ein Integer zu übergeben, dann kann dann später auch jeder was anderes übergeben (char eines Strings, Single etc.)
|
Re: Welches Bit in einer Zahl ist gesetzt
"TStringlist" ist der Benutzername.
Delphi-Quellcode:
Das ist wirklich grauenhaft ineffizienter Code. Power() liefert ein Extended das von Trunc() wieder in ein Int64 verwandelt wird.
if Zahl and trunc(Power(2,15)) > 0 then Bit15_ist_gesetzt
Jetzt erfolgt das "and" auf Int64. Damit ist zwar das ">" korrekt, aber nicht wirklich gut. |
Re: Welches Bit in einer Zahl ist gesetzt
Zitat:
aber Pointer sind böse :mrgreen: (zumindest unter .net) Ich muß mal testen, ob mein Programm überhaupt in .net geht :-) (D2005) |
Re: Welches Bit in einer Zahl ist gesetzt
Zitat:
Hatte mich heute Morgen mit meiner Freundin gezofft, deshalb fühlte ich mich wohl persönlich angegriffen. (Ich mag keine Bastonade, Schmerzen sind doof.) Sorry, bin manchmal ein Sensibelchen, war nicht so gemeint. ;-) (-> Habe mich wieder beruigt) |
Re: Welches Bit in einer Zahl ist gesetzt
Vielen Dank für die zahlreichen Vorschläge. :dp:
Da ich nur mit Integer-Werten arbeite, werde ich mich für die rechts simple Methode von Dax entscheiden. @MaBuSE - hoffe, du kommst mit deiner Freundin wieder ins Reine :zwinker: |
Re: Welches Bit in einer Zahl ist gesetzt
Zitat:
|
Re: Welches Bit in einer Zahl ist gesetzt
Verrat ihr aber besser nicht was eine Bastonade ist :-)
|
Re: Welches Bit in einer Zahl ist gesetzt
Da müsst ihr jetzt durch:
Delphi-Quellcode:
Fröhliche Grüße vom marabu
function BitTest(const c: cardinal; bit: byte): boolean;
begin Result := Odd(c shr bit); end; |
Re: Welches Bit in einer Zahl ist gesetzt
Da Sets in Delphi über Bits realisiert sind, geht's auch sehr schön so:
Delphi-Quellcode:
type
T32Bits = set of 0..31; var i: Integer; // ... if 15 in T32Bits(i) then ShowMessage('Bit 15 ist gesetzt'); Include(T32Bits(i), 4); // setze Bit 4 auf 1 // andere Set-Operationen funktionieren natürlich auch |
Re: Welches Bit in einer Zahl ist gesetzt
Uups, die Threadfortsetzung ist mir tatsächlich irgendwie durch die Lappen gegangen... (wahrscheinlich durch eine Deaktivierung der Auto-Einloggung und weshalb nach dem ersten EMail keine weiteren kamen).
@ Robert Marquardt na na, jetzt mach aber mal ein bisschen halblang. Ich war seit Wochen nicht mehr da und hatte nur kurz vergessen, dass hier immer und überall die theoretisch aller letzt mögliche Effizienz das aller einzigste Kriterium überhaupt ist. Ehrlich gesagt, war meine Code-Zeile eher als Tipp gedacht, der die Sache aber bloß ganz besonders anschaulich machen sollte, also bei einer Dualzahldarstellung eben mit Basis 2 und ABit (=15) als Exponent zu agieren... Ansonsten achte ich aber in Sequenzen die häufig durchlaufen werden durchaus auch etwas auf Effizienz (was hier aber in keinster Weise extra gewünscht war). In solchen Situation benutzte ich z.B. auch schon des häufigeren diesen wahrscheinlich etwas schnelleren Code:
Delphi-Quellcode:
ob du's glaubst oder nicht, was egal ist.
function TForm1.checkBit(ADig,ABit : integer) : boolean;
const BitDim : array[0..15] of word = (1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768); begin Result := ADig and BitDim[ABit] > 0; end; PS. Übrigens dein Satz mit dieser Bastonade ist gar nicht so lustig, wie du vielleicht glaubst. Auch schon alleine im Gebrauch solcher Vokabeln versucht sich nämlich ein entsprechender Geistesinhalt freizuschaufeln und weshalb man da nicht so billig mit herumlabern sollte. Sonst schlägst du nämlich morgen nochmal tatsächlich deine Kids (wenn du welche hast) nur weil sie irgendwo mal zufälligerweise nicht 100% effizient waren, ...nur um allen dadurch nochmal ganz besonders deutlich gemacht zu haben, dass du dich ja auch wirklich schon so so gut wähnst, dass du es deswegen ja eigentlich auch schon gar nicht mehr richtig aushalten kannst. (Diese versuchte Aufgeilerei bei solchen nur Sachthemen ist doch einfach bloß Schwachsinn!) |
Re: Welches Bit in einer Zahl ist gesetzt
Hallo,
Delphi-Quellcode:
Zwar im Prinzip die gleiche Lösung, aber eleganter:
function TForm1.checkBit(ADig,ABit : integer) : boolean;
const BitDim : array[0..15] of word = (1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768); begin Result := ADig and BitDim[ABit] > 0; end;
Delphi-Quellcode:
Das ganze ist nicht getestet und es sind auch keine Fehler abgefangen. B>15 wäre eine Problem.
function testbit(a,b:word):boolean;
var s:word; begin s:=1; result:=false; If b <>1 then s:= s shl(b-1); If (A and s) > 0 then result:=true; end; end; Ausserdem (für die Obergescheiten) etwas schulmässig geschrieben, damits auch jeder versteht. Rainer Rainer |
Re: Welches Bit in einer Zahl ist gesetzt
ach Leute, es wurde gleich am Anfang schon eine supi Variante gepostet, diese leicht abgeändert und man kann eigentlich jeden Typ übergeben (bzw. einen Pointer darauf)
Delphi-Quellcode:
Und niemand hindert einen dann daran einen anderen Pointer zu übergeben. So kann man sich zum beispiel ausgeben lassen ob das 0te Bit eine Charakters gesetzt ist ohne erst zu casten weil es eben auch als Pointer übergeben wird.
function IsSet(pIntToCheck: PInteger; Bit: Integer): Boolean;
begin Result := pIntToCheck^ and (1 shl Bit) <> 0; end;
Delphi-Quellcode:
var lMeinString: String;
begin lMeinString := 'abcde'; ShowMessage(BoolToStr(IsSet(@lMeinString[2], 0), True)); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:39 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