![]() |
|
|
Регистрация | << Правила форума >> | 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; Не стоит путать форумы с богадельнями. © Bargest Последний раз редактировалось Freeman, 05.09.2014 в 14:25. |
Этот пользователь сказал Спасибо Freeman за это полезное сообщение: | ||
reqyz (24.09.2014)
|
#5
|
||||
|
||||
![]() Цитата:
Код:
function BSR(Value: LongInt): LongInt; assembler; asm BSR EAX, Value end; К счастью, эта инструкция переваривает и работу с памятью. Цитата:
jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось 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; Не стоит путать форумы с богадельнями. © Bargest Последний раз редактировалось Freeman, 06.09.2014 в 22:16. |
Этот пользователь сказал Спасибо Freeman за это полезное сообщение: | ||
reqyz (24.09.2014)
|