Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#15

AW: Binärdarstellung einer Zahl mit einer einzigen Stringallokation

  Alt 24. Mai 2012, 13:52
Damit wird ja schon allein zur Längenbestimmung jedes Bits angesehen!

Wobei BSR auch nicht so toll sein soll.
Zumindestens für 32 Bit war es so (64 weiß ich nicht), aber da gab es letzes Jahr einen Thread dazu, wo ich dieses BSR verwendete.


Delphi-Quellcode:
function GetLengthofBinString(z: LongWord): LongInt; inline:

function GetLengthOfBinString(Value: LongWord): LongInt;
begin
  Result := 32;
  while (Result >= 0) and (LongInt(Value) >= 0) do begin
    Dec(Result);
    Value := Value shl 1;
  end;
end;
Mit etwas Glück macht der Compiler daraus einen Code, welcher nur 2 Register belegt und komplett innerhalb der Register arbeitet.

Oder man nutzt eben doch Assembler.



klar, man könnte jetzt noch über eine Bitmaske mehrere Bits prüfen.
z.B. jedes Byte einzeln, aber ob das immer was bringt?

Delphi-Quellcode:
function GetLengthOfBinString(Value: LongWord): LongInt;
begin
  if Value = 0 then
    Exit(0);
  Result := 32;
  if Value and $FFFF0000 = 0 then begin
    Result := 16;
    Value := Value shl 16;
  end;
  while (Result >= 0) and (LongInt(Value) >= 0) do begin
    Dec(Result);
    Value := Value shl 1;
  end;
end;

//oder

function GetLengthOfBinString(LongWord: LongWord): LongInt;
begin
  if Value = 0 then
    Exit(0);
  Result := 32;
  while (Result >= 0) and (Value and $FF000000 = 0) do begin
    Dec(Result, 8);
    Value := Value shl 8;
  end;
  while (Result >= 0) and (LongInt(Value) >= 0) do begin
    Dec(Result);
    Value := Value shl 1;
  end;
end;
Die Pascal-Variante hätte den Vorteil derPlattformunabhängigkeit und sie könnte man auch für 64 Bit anpassen.
32 = SizeOf(NativeInt) * 8
LongInt = NativeInt
LongWord = LongWord
$FF000000 = ($FF shl (SizeOf(NativeInt) - 1) * 8)
usw.
$2B or not $2B

Geändert von himitsu (24. Mai 2012 um 14:04 Uhr)
  Mit Zitat antworten Zitat