- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
static U32 Round_up_to_next_2_power( U32 value )
{
if ( value > 16 )
if ( value > 64 )
if ( value > 128 )
if ( value > 256 )
if ( value > 512 )
return( 1024 );
else
return( 512 );
else
return( 256 );
else
return( 128 );
else
if ( value > 32 )
return( 64 );
else
return( 32 );
else
if ( value > 4 )
if ( value > 8 )
return( 16 );
else
return( 8 );
else
if ( value > 2 )
return( 4 );
return( value );
}
Ну вот первый попавшийся байтоёбский вариант для 32 бит: > переписать нормально
> выиграть
5 непредсказуемых условных переходов никак не могут быть быстрее 10 логических операций. Без шансов.
Но два непредсказанных перехода могут оказаться дороже этого десятка операций т.к. сбивают пайплайн...
Даже один! Ибо конвееры у большинства современных ЦП длиной 15-20 инструкций.
http://govnokod.ru/16008#comment232774
P.S. Ну и в любом случае кроссплатформенного способа для нестандартных операций нету и походу не будет. Так что если делать через эти фичи - придется трахаться с вариантами для разных компиляторов и осей ;(
Так что код, который я кидал - более-менее разумный компромисс между скоростью и ёблей.
интристики описаны там же в википедии следующим разделом http://en.wikipedia.org/wiki/Find_first_set#Tool_and_library_support
unsigned __int64 _tzcnt_u64(unsigned __int64 src);
Как-то все забыли про старый-добрый BSF.
Та умные компилеры превращают такие "станадартные" байтоебские коды в одну инструкцию. А самописную срань с ветками они откажутся оптимизировать.
некоторые системы еще умеют и find last set - man fls
ffs попал в позикс. fls не думаю что до туда когда попадет.
PS в gcc - __builtin_ffs*(). в добавок __builtin_clz и __builtin_ctz - http://gcc.gnu.org/onlinedocs/gcc-4.8.1/gcc/Other-Builtins.html
Ну да. С этим утверждением трудно поспорить что бы не говорил wvxvw.
Я бы выделил частный случай: if (i&(i-1)==0) return i;
в остальном вариант борманда практически оптимален.
> старое