AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Welches Bit in einer Zahl ist gesetzt

Ein Thema von smudo · begonnen am 4. Okt 2005 · letzter Beitrag vom 7. Okt 2005
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

Re: Welches Bit in einer Zahl ist gesetzt

  Alt 5. Okt 2005, 06:59
Zitat von SirThornberry:
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.)
Stimmt, mit dem Pointer wäre es einfacher,
aber Pointer sind böse (zumindest unter .net)

Ich muß mal testen, ob mein Programm überhaupt in .net geht (D2005)
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

Re: Welches Bit in einer Zahl ist gesetzt

  Alt 5. Okt 2005, 07:05
Zitat von Robert Marquardt:
"TStringlist" ist der Benutzername.
if Zahl and trunc(Power(2,15)) > 0 then Bit15_ist_gesetzt Das ist wirklich grauenhaft ineffizienter Code. Power() liefert ein Extended das von Trunc() wieder in ein Int64 verwandelt wird.
Jetzt erfolgt das "and" auf Int64. Damit ist zwar das ">" korrekt, aber nicht wirklich gut.
Ach so. TStringList als Username, da muß man erst mal drauf kommen.

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)
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#13

Re: Welches Bit in einer Zahl ist gesetzt

  Alt 5. Okt 2005, 07:34
Vielen Dank für die zahlreichen Vorschläge.

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
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#14

Re: Welches Bit in einer Zahl ist gesetzt

  Alt 5. Okt 2005, 08:31
Zitat von smudo:
@MaBuSE - hoffe, du kommst mit deiner Freundin wieder ins Reine
Alles wieder im grünen Bereich. (war ein dummes Missverständniss)
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#15

Re: Welches Bit in einer Zahl ist gesetzt

  Alt 5. Okt 2005, 08:33
Verrat ihr aber besser nicht was eine Bastonade ist
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#16

Re: Welches Bit in einer Zahl ist gesetzt

  Alt 5. Okt 2005, 08:34
Da müsst ihr jetzt durch:

Delphi-Quellcode:
function BitTest(const c: cardinal; bit: byte): boolean;
begin
  Result := Odd(c shr bit);
end;
Fröhliche Grüße vom marabu
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#17

Re: Welches Bit in einer Zahl ist gesetzt

  Alt 5. Okt 2005, 17:23
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
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: Welches Bit in einer Zahl ist gesetzt

  Alt 7. Okt 2005, 00:09
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:
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;
ob du's glaubst oder nicht, was egal ist.


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!)
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
runger
(Gast)

n/a Beiträge
 
#19

Re: Welches Bit in einer Zahl ist gesetzt

  Alt 7. Okt 2005, 06:40
Hallo,

Delphi-Quellcode:
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;
Zwar im Prinzip die gleiche Lösung, aber eleganter:

Delphi-Quellcode:
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;
Das ganze ist nicht getestet und es sind auch keine Fehler abgefangen. B>15 wäre eine Problem.
Ausserdem (für die Obergescheiten) etwas schulmässig geschrieben, damits auch jeder versteht.

Rainer

Rainer
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#20

Re: Welches Bit in einer Zahl ist gesetzt

  Alt 7. Okt 2005, 07:28
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:
function IsSet(pIntToCheck: PInteger; Bit: Integer): Boolean;
begin
  Result := pIntToCheck^ and (1 shl Bit) <> 0;
end;
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.
Delphi-Quellcode:
var lMeinString: String;
begin
  lMeinString := 'abcde';
  ShowMessage(BoolToStr(IsSet(@lMeinString[2], 0), True));
end;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:15 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