LINUX.ORG.RU

История изменений

Исправление 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

?