Есть несколько способов оптимизации функций.
Оптимизация с операторами поразрядными:
inline uint32_t ShiftOf(uint32_t v)
{
uint32_t s =
(bool)(v & 0xFFFF0000) * 16 +
(bool)(v & 0xFF00FF00) * 8 +
(bool)(v & 0xF0F0F0F0) * 4 +
(bool)(v & 0xCCCCCCCC) * 2 +
(bool)(v & 0xAAAAAAAA);
return v == 1 << s ? s : -1;
}
Оптимизация с компилятором встроенных функций:
inline uint32_t ShiftOf(uint32_t v)
{
#if defined(_MSC_VER)
DWORD s = 0;
if (!_BitScanForward(&s, v))
return -1;
#elif defined(__GNUC__)
uint32_t s = __builtin_ctz(v);
#else
# error This platform is unsupported!
#endif
return v == 1 << s ? s : -1;
}
Оптимизация с хэш-таблицы:
const uint32_t g_divider = 37;
uint32_t g_hash[g_divider] = { 0 };
static void InitHash()
{
for (uint32_t s = 0; s < 32; ++s)
g_hash[(1 << s) % g_divider] = s;
}
inline uint32_t ShiftOf(uint32_t v)
{
uint32_t s = g_hash[v % g_divider];
return v == 1 << s ? s : -1;
}
Вы действительно хотите 'ShiftOf (6) == -1'? – Hurkyl
@PeteBecker он, вероятно, имел в виду «полный» log2: если log2 (v) является целым числом, тогда верните его, иначе return -1. – jingyu9575
@ LưuVĩnhPhúc Этот вопрос требует способа проверить * если * установлен любой бит, игнорируя положение. Этот вопрос задает вопрос о том, как определить бит *, который * задан, по-видимому, предполагая, что на входе установлен только один бит. Связано, но не дублируется. – Bob