История изменений
Исправление monk, (текущая версия) :
А чем хуже:
#if defined(HAVE___BUILTIN_CLZ)
static inline unsigned util_last_bit(unsigned u)
{
return u == 0 ? 0 : 32 - __builtin_clz(u);
}
// здесь прочая фигня, использующая __builtin_clz
#elif defined(_MSC_VER) && (_M_IX86 || _M_ARM || _M_AMD64 || _M_IA64)
static inline unsigned util_last_bit(unsigned u)
{
unsigned long index;
if (_BitScanReverse(&index, u))
return index + 1;
else
return 0;
}
// здесь прочая микрософтовская фигня
#else
static inline unsigned util_last_bit(unsigned u)
{
unsigned r = 0;
while (u) {
r++;
u >>= 1;
}
return r;
}
#endif
?
Исходная версия monk, :
А чем хуже:
#if defined(HAVE___BUILTIN_CLZ)
static inline unsigned util_last_bit(unsigned u)
{
return u == 0 ? 0 : 32 - __builtin_clz(u);
}
// здесь прочая фигня, использующая __builtin_clz
#elif defined(_MSC_VER) && (_M_IX86 || _M_ARM || _M_AMD64 || _M_IA64)
static inline unsigned util_last_bit(unsigned u)
{
unsigned long index;
if (_BitScanReverse(&index, u))
return index + 1;
else
return 0;
}
// здесь прочая микрософтовская фигня
#else
static inline unsigned util_last_bit(unsigned u)
{
unsigned r = 0;
while (u) {
r++;
u >>= 1;
}
return r;
}
#endif
?