В духе 0x5f3759df II's Quake и версии IEEE Взломов Битового жонглирования - это решение достигает двойного для извлечения экспоненты как средства вычислить пол (lg2 (n)). Это немного быстрее, чем принятое решение и намного быстрее, чем версия IEEE Битового жонглирования, так как это избегает математических операций с плавающей точкой. Как кодировано, это предполагает, что двойным является real*8 плавание IEEE на небольшой машине порядка байтов.
int nextPow2(int n)
{
if ( n <= 1 ) return n;
double d = n-1;
return 1 << ((((int*)&d)[1]>>20)-1022);
}
Редактирование: Добавьте оптимизированную x86 версию блока с помощью коллеги. 4%-й выигрыш в быстродействии, но все еще приблизительно на 50% медленнее, чем bsr версия (6 секунд по сравнению с 4 на моем ноутбуке для n=1.. 2^31-2).
int nextPow2(int n)
{
if ( n <= 1 ) return n;
double d;
n--;
__asm {
fild n
mov eax,4
fstp d
mov ecx, dword ptr d[eax]
sar ecx,14h
rol eax,cl
}
}
просто используйте
= render :partial => '/layouts/tracking'
I think you just pass it a full path to it, like
<%= render "shared/menu" %>
ref: 3.4.1 second example here: http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials