@himitsu:
Oben hast du Performancemäßig ja noch genau einen
ASM-Befehl rausoptimiert.
Jetzt mit deiner Methode zur Prüfung auf negative Zahlen hast du bis zu 7
ASM-Befehle unnötig reingbracht.
Hier mal meine Lösung, die Performancemäßig am besten war:
Delphi-Quellcode:
function IsPowerOfTwoInl(const Value: Cardinal): Boolean; inline;
begin
Result := (Value > 0) and (Value and (Value -1) = 0);
end;
//...
var
value: Cardinal;
begin
isPow2 := IsPowerOfTwoInl(value);
end;
Dieses ergibt 11
ASM-Befehle, wobei durch optimale Jumps minimal 6 Befehle durchlaufen werden.
Wenn man jetzt negative Zahlen testen will, soll man folgendes machen:
Delphi-Quellcode:
//...
var
value: Integer;
begin
isPow2 := IsPowerOfTwoInl(Abs(value));
end;
Diese ergibt 14
ASM-Befehle, wobei durch optimale Jumps minimal 7 Befehle durchlaufen werden.
(Dabei habe ich die standard Delphi abs()-Funktion genommen.)
Also negaH´s Funktion ist schon sehr schnell, wer aber noch mehr will, der sollte "inline" hinten dran hängen.