Показать сообщение отдельно
  #7  
Старый 08.10.2014, 10:32
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Freeman,

Цитата:
Моя версия будет выглядеть так:
Код:
function MostSignificantBit(Value: Int64): LongInt; overload; // к предыдущей, тоже overload
asm
        BSR EAX, EDX
        JZ @@lo
        SHL EAX, 1
        RET
@@lo:
        BSR EAX, EAX
end;

Ну и как ЭТО будет работать?
Value при вызове функции находится в паре регистров, в EDX - старшая часть, в EAX - младшая.
3) BSR EAX, EDX - в EAX грузим номер старшей единицы из старшей половины числа.
4) JZ @@lo - если там ноль, то переходим к строке 8)
5) SHL EAX, 1 - зачам-то умножаем на два, хотя надо прибавить 32

8) BSR EAX, EAX - а теперь в EAX гарантировано ноль
Ответить с цитированием