![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Доброго времени суток уважаемые форумчане.
есть число X, как мы знаем в памяти оно хранится как набор единиц и нулей например 13 это 1101 и т д задача: узнать положение ближайшей единицы, то-есть, четвертая с конца, значит бинарный размер = 4 предполагаю что делается на asm, благо в делфи его можно прикручивать. пытался сделать через trunc(log2(abs(x))+1), работало, но использование функций, работающих с ieee745 или как его там, к сожалению запрещено, подскажите, как можно найти позицию единички? заранее благодарю |
|
#2
|
||||
|
||||
|
Непонятно зачем это надо, но, если число меньше чем 2^x то его "бинарный размер" = x
|
|
#3
|
|||
|
|||
|
Цитата:
Код:
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 |
|
#4
|
||||
|
||||
|
Посмотрел в справочнике: Код:
function MostSignificantBit(Value: LongInt): LongInt;
asm
BSR EAX, EAX
end;Последний раз редактировалось Freeman, 05.09.2014 в 14:25. |
| Этот пользователь сказал Спасибо Freeman за это полезное сообщение: | ||
reqyz (24.09.2014)
| ||
|
#5
|
||||
|
||||
|
Цитата:
Код:
function BSR(Value: LongInt): LongInt; assembler;
asm
BSR EAX, Value
end;К счастью, эта инструкция переваривает и работу с памятью. Цитата:
Последний раз редактировалось Bargest, 05.09.2014 в 16:12. |
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
reqyz (24.09.2014)
| ||
|
#6
|
||||
|
||||
|
Цитата:
На плохом форуме кто-то написал быдлокод для Int64. Моя версия будет выглядеть так: Код:
function MostSignificantBit(Value: Int64): LongInt; overload; // к предыдущей, тоже overload
asm
BSR EAX, EDX
JZ @@lo
SHL EAX, 1
RET
@@lo:
BSR EAX, EAX
end;Последний раз редактировалось Freeman, 06.09.2014 в 22:16. |
| Этот пользователь сказал Спасибо Freeman за это полезное сообщение: | ||
reqyz (24.09.2014)
| ||