|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Stepan Polovnikov 2:5056/16.47 16 Jul 2001 20:59:21 To : Ђ¤аҐ© Њ ЄбЁ¬ҐЄ® Subject : найти ближайшую бОльшую степень двойки минус 1 --------------------------------------------------------------------------------
АМ> Число - целое 8 байт (Int64)
АМ> необх найти ближайшую бОльшую степень двойки минус 1, т.е.
АМ> для 4...7 - это 7;
АМ> для 32...63 - это 63;
АМ> Делаю так:
АМ> i := i or (i shr 1);
АМ> i := i or (i shr 2);
АМ> i := i or (i shr 4);
АМ> i := i or (i shr 8);
АМ> i := i or (i shr 16);
АМ> i := i or (i shr 32);
АМ> Второй вариант короче, но в 6 раз медленнее:
АМ> i := 2 shl Floor(log2(i))-1 // Floor - целая часть числа
АМ> Есть ли более оптимальный вариант? Hичего в голову не приходит.
; edx:eax=int64
mov ebx,1
bsr ecx,edx
je @@low
shl ebx,cl
dec ebx
or eax,-1
or edx,ebx
jmp @@zero
@@low: bsr ecx,eax
je @@zero
shl ebx,cl
dec ebx
or eax,ebx
@@zero:
; edx:eax=result
Bye!
Stepan
--- GoldED+/W32 1.1.5-20010529
* Origin: NETMAIL (2:5056/16.47)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор Архивное /ru.algorithms/223903b531ed0.html, оценка из 5, голосов 10
|