Какой самый простой способ проверить, является ли число степенью 2 в C ++?
Если у вас современный процессор Intel с инструкциями по обработке битов , то вы можете выполнить следующее. Он пропускает прямой код C / C ++, потому что другие уже ответили на него, но он вам нужен, если BMI недоступен или не включен.
bool IsPowerOf2_32(uint32_t x)
{
#if __BMI__ || ((_MSC_VER >= 1900) && defined(__AVX2__))
return !!((x > 0) && _blsr_u32(x));
#endif
// Fallback to C/C++ code
}
bool IsPowerOf2_64(uint64_t x)
{
#if __BMI__ || ((_MSC_VER >= 1900) && defined(__AVX2__))
return !!((x > 0) && _blsr_u64(x));
#endif
// Fallback to C/C++ code
}
Поддержка BMI сигналов GCC, ICC и Clang с __BMI__
. Он доступен в компиляторах Microsoft в Visual Studio 2015 и более поздних версиях, когда AVX2 доступен и включен . Сведения о заголовках см. В Файлы заголовков для встроенных функций SIMD .
.
Обычно я защищаю _blsr_u64
с _LP64_
в случае компиляции на i686. Clang нуждается в небольшом обходном пути, потому что он использует несколько иной внутренний символ nam:
#if defined(__GNUC__) && defined(__BMI__)
# if defined(__clang__)
# ifndef _tzcnt_u32
# define _tzcnt_u32(x) __tzcnt_u32(x)
# endif
# ifndef _blsr_u32
# define _blsr_u32(x) __blsr_u32(x)
# endif
# ifdef __x86_64__
# ifndef _tzcnt_u64
# define _tzcnt_u64(x) __tzcnt_u64(x)
# endif
# ifndef _blsr_u64
# define _blsr_u64(x) __blsr_u64(x)
# endif
# endif // x86_64
# endif // Clang
#endif // GNUC and BMI
Можете ли вы сказать мне хороший веб-сайт, где можно найти такой алгоритм?
Этот сайт часто цитируется: Bit Twiddling Hacks .