Цитата:
Сообщение от Aristarh Dark
Непонятно зачем это надо, но, если число меньше чем 2^x то его "бинарный размер" = x
|
спасибо конечно, но это будет работать ещё дольше приведенного мною кода, и уж поверьте об этом и о различным ускоряющих модификациях вашего подхода я догадался, но суть в том что задачу эту можно выполнить намного быстрее чтением бинарной памяти, которым я к сожалению не владею, так как она скорее всего реализовывается через вставки asm вот в этом мне нужна помошь.
Код:
function GetCount(const Base:byte;X:Int64):cardinal;
var
z:int64;
zp:cardinal;
Base3:cardinal;
xx:int64;
begin
Result:=0;
Base3:=Base*Base*base;
xx:=0;
while X>0 do
begin
z:=1;
zp:=0;
while X>=Z do
begin
Z:=Z*base3;
xx:=X;
X:=X div Z;
inc(zp,3);
inc(Result,zp);
end;
end;
if(xx<>0)and(X=0)then
begin
Z:=Z div (Base*Base);
xx:=xx div Z;
if(xx=0)then
dec(Result,2)
else
if(xx<base)then
dec(Result,1);
end;
end;
вот что пока получилось навоять, 10 000 000 значений максимального DWord - овского числа за 3 секунды определяет длину, но это не правильный подход и изврат, помогите с asm