- 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 );
}
myaut 23.05.2014 09:33 # 0
wvxvw 23.05.2014 10:18 # 0
bormand 23.05.2014 10:23 # +4
Ну вот первый попавшийся байтоёбский вариант для 32 бит: > переписать нормально
> выиграть
5 непредсказуемых условных переходов никак не могут быть быстрее 10 логических операций. Без шансов.
wvxvw 23.05.2014 10:32 # 0
bormand 23.05.2014 10:36 # +3
Но два непредсказанных перехода могут оказаться дороже этого десятка операций т.к. сбивают пайплайн...
wvxvw 23.05.2014 10:40 # 0
roman-kashitsyn 23.05.2014 10:48 # +1
3.14159265 23.05.2014 17:58 # +1
Даже один! Ибо конвееры у большинства современных ЦП длиной 15-20 инструкций.
3.14159265 23.05.2014 17:42 # 0
http://govnokod.ru/16008#comment232774
guest 23.05.2014 11:40 # 0
bormand 23.05.2014 11:46 # +1
P.S. Ну и в любом случае кроссплатформенного способа для нестандартных операций нету и походу не будет. Так что если делать через эти фичи - придется трахаться с вариантами для разных компиляторов и осей ;(
Так что код, который я кидал - более-менее разумный компромисс между скоростью и ёблей.
guest 23.05.2014 11:52 # 0
интристики описаны там же в википедии следующим разделом http://en.wikipedia.org/wiki/Find_first_set#Tool_and_library_support
3.14159265 23.05.2014 17:37 # 0
unsigned __int64 _tzcnt_u64(unsigned __int64 src);
Как-то все забыли про старый-добрый BSF.
3.14159265 23.05.2014 17:55 # +1
Та умные компилеры превращают такие "станадартные" байтоебские коды в одну инструкцию. А самописную срань с ветками они откажутся оптимизировать.
Dummy00001 24.05.2014 01:14 # 0
некоторые системы еще умеют и 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
3.14159265 23.05.2014 17:45 # 0
Ну да. С этим утверждением трудно поспорить что бы не говорил wvxvw.
3.14159265 23.05.2014 17:51 # 0
Я бы выделил частный случай: if (i&(i-1)==0) return i;
в остальном вариант борманда практически оптимален.
1024-- 23.05.2014 10:57 # 0
DBdev 23.05.2014 16:00 # +1
> старое