Qual è il modo più semplice per verificare se un numero è una potenza di 2 in C ++?
Se si dispone di un moderno processore Intel con le istruzioni per la manipolazione dei bit , è possibile eseguire quanto segue. Omette il codice C / C ++ diretto perché altri hanno già risposto, ma ne hai bisogno se BMI non è disponibile o abilitato.
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 supporto BMI del segnale Clang con __BMI__
. È disponibile nei compilatori Microsoft in Visual Studio 2015 e versioni successive quando AVX2 è disponibile e abilitato . Per le intestazioni di cui hai bisogno, consulta File di intestazione per gli elementi intrinseci SIMD .
Di solito proteggo il _blsr_u64
con una _LP64_
compilazione del caso su i686. Clang ha bisogno di una piccola soluzione alternativa perché utilizza un simbolo intrinseco leggermente diverso 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
Puoi dirmi un buon sito web in cui è possibile trovare questo tipo di algoritmo?
Questo sito web è spesso citato: Bit Twiddling Hacks .