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.