Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Vladislav Irdullin                   2:5093/55.111  16 Jul 2001  22:57:34
 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ичего в голову не приходит.
 
 я дам саму логику для 32-битных чисел на дельфи/ассемблере, в общем сам принцип 
 чтоб ты понял, я в комментариях всё описал.
 
 Number - начальное число, возвращает ближайшую бОльшую степень двойки минус 1
 LongWord - это беззнаковый 32-битный тип данных в дельфи.
 
 type
   UINT32 = LongWord;
 
 function HазовиСам(Number: UINT32): UINT32; register;
 label
   L1;
 asm
       xor ecx,ecx    // обнуляем ecx, если этого не сделать, то в случае
                      // Number = 0 после следующей команды в ecx останется
                      // случайное число
       bsr ecx,eax    // получаем в ecx номер первого бита слева, равного
                      // единице
                      // (Number в соглашении о вызовах "register" передаётся в
                      // регистре eax)
       inc ecx        // увеличиваем номер бита, чтоб получить степень двойки
       xor eax,eax    // eax = 0
       inc eax        // eax = 1
       shl eax,cl     // получаем в eax ближайшую бОльшую степень двойки
       dec eax        // уменьшаем на единицу, результат по этому же соглашению
                      // должен возвращаться в eax
       jnz L1         // если eax <> 0, то выходим
       dec eax        // в противном случае у нас получилось переполнение, т.е.
                      // ввели число в диапазоне $80000000..$ffffffff, т.е.
                      // младшие 5 бит регистра cl были равны нулю при сдвиге
                      // и eax не поменялось после сдвига, после первого
                      // dec eax регистр eax стал =0, так что нужно его
                      // уменьшить ещё разок
 L1:   ret
 end;
 
 для 64-битных чисел два двойных слова передаются через стек. Сделай сам.
 
 WBR, Влад | РФ, г. Hабережные Челны
 ... army| "л" стоит где-то в конце алфавита. пусть она будет 8-й
 --- бабы, ребятня, мужики..
  * Origin: (.ъ silence ъ.) (2:5093/55.111)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 найти ближайшую бОльшую степень двойки минус 1   Ђ­¤аҐ© Њ ЄбЁ¬Ґ­Є®   16 Jul 2001 12:29:30 
 найти ближайшую бОльшую степень двойки минус 1   Stepan Polovnikov   16 Jul 2001 20:59:21 
 найти ближайшую бОльшую степень двойки минус 1   Vladislav Irdullin   16 Jul 2001 22:57:34 
 найти ближайшую бОльшую степень двойки минус 1   Max Alekseyev   18 Jul 2001 03:28:58 
 Re: найти ближайшую бОльшую степень двойки минус 1   Yuriy Kaminskiy   19 Jul 2001 22:03:33 
 найти ближайшую бОльшую степень двойки минус 1   Max Alekseyev   20 Jul 2001 16:11:58 
 найти ближайшую бОльшую степень двойки минус 1   Stanislav Shwartsman   20 Jul 2001 16:30:36 
 найти ближайшую бОльшую степень двойки минус 1   Kluchnikov Eugene   20 Jul 2001 20:00:32 
 найти ближайшую бОльшую степень двойки минус 1   Gleb   24 Jul 2001 21:55:11 
 найти ближайшую бОльшую степень двойки минус 1   Kluchnikov Eugene   25 Jul 2001 00:19:52 
 [*] Re: найти ближайшую бОльшую степень двойки минус 1   Comoderator Of Ru Algorithms   25 Jul 2001 17:26:24 
 Re: найти ближайшую бОльшую степень двойки минус 1   Comoderator Of Ru Algorithms   25 Jul 2001 17:20:58 
 найти ближайшую бОльшую степень двойки минус 1   Max Alekseyev   21 Jul 2001 00:31:18 
 найти ближайшую бОльшую степень двойки минус 1   Stanislav Shwartsman   21 Jul 2001 09:43:02 
 найти ближайшую бОльшую степень двойки минус 1   Max Alekseyev   21 Jul 2001 14:03:36 
 Re: найти ближайшую бОльшую степень двой ки минус 1   Andrew Ezhguroff   21 Jul 2001 15:47:14 
 найти ближайшую бОльшую степень двой ки минус 1   Max Alekseyev   21 Jul 2001 19:40:20 
 Re: найти ближайшую бОльшую степень двой ки минус 1   Andrew Ezhguroff   22 Jul 2001 02:17:25 
 найти ближайшую бОльшую степень двой ки минус 1   Dmitriy Litskalov   22 Jul 2001 10:52:54 
 найти ближайшую бОльшую степень двой ки минус 1   Dmitriy Litskalov   22 Jul 2001 12:33:58 
Архивное /ru.algorithms/38993b533939.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional