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 гарантировано ноль