Qual é a maneira mais simples de testar se um número é uma potência de 2 em C ++?
Se você tiver um processador Intel moderno com as instruções de manipulação de bits , poderá executar o seguinte. Omite o código C / C ++ direto porque outros já responderam, mas você precisa dele se o IMC não estiver disponível ou ativado.
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
}
GCC, ICC e Clang sinalizam suporte para IMC com __BMI__
. Ele está disponível em compiladores da Microsoft no Visual Studio 2015 e superior quando o AVX2 está disponível e ativado . Para os cabeçalhos de que você precisa, consulte Arquivos de cabeçalho para intrínsecos SIMD .
Eu normalmente guardo o _blsr_u64
com um _LP64_
caso compilando em i686. O Clang precisa de uma pequena solução alternativa porque usa um nome de símbolo intrínseco ligeiramente diferente:
#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
Você pode me dizer um bom site onde esse tipo de algoritmo pode ser encontrado?
Este site é frequentemente citado: Bit Twiddling Hacks .