|
|
Регистрация | << Правила форума >> | 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)
|
#7
|
|||
|
|||
Freeman,
Цитата:
Ну и как ЭТО будет работать? Value при вызове функции находится в паре регистров, в EDX - старшая часть, в EAX - младшая. 3) BSR EAX, EDX - в EAX грузим номер старшей единицы из старшей половины числа. 4) JZ @@lo - если там ноль, то переходим к строке 8) 5) SHL EAX, 1 - зачам-то умножаем на два, хотя надо прибавить 32 8) BSR EAX, EAX - а теперь в EAX гарантировано ноль |
Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
Freeman (08.10.2014)
|
#8
|
||||
|
||||
Цитата:
Цитата:
Попутно выяснилось также, что Delphi за каким-то чертом создает стековый кадр в этой простой функции, и голый RET не работает, нужно восстановление EBP. Чтобы не завязываться на причуды Delphi, пришлось добавить второй переход: Код:
function MostSignificantBit(Value: Int64): LongInt; overload; asm BSR EAX, EDX // неопределенное поведение JZ @@lo ADD EAX, 32 JMP @@exit @@lo: BSR EAX, EAX @@exit: end; function MostSignificantBit(Value: Int64): LongInt; overload; asm BSR EDX, EDX // безопасно во всех смыслах JZ @@lo MOV EAX, 32 ADD EAX, EDX JMP @@exit @@lo: BSR EAX, EAX @@exit: end; Не стоит путать форумы с богадельнями. © Bargest |
#9
|
|||
|
|||
Цитата:
Вот для этого и пишут assembler |
#10
|
||||
|
||||
Цитата:
jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Freeman (08.10.2014)
|
#11
|
||||
|
||||
Извращенцы…
Метод дихотомии не катит? — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию Последний раз редактировалось M.A.D.M.A.N., 08.10.2014 в 20:13. |
#12
|
||||
|
||||
Цитата:
Не стоит путать форумы с богадельнями. © Bargest |
#13
|
||||
|
||||
Кусок кода реализация команды BSR:
Код:
i := 31; while ((j and $80000000) = 0) do begin Dec(i); j := j shl 1; end; Чо вы какую-то х-ню городите на ассемблере? — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию Последний раз редактировалось M.A.D.M.A.N., 08.10.2014 в 20:28. |