Apa cara paling sederhana untuk menguji apakah suatu bilangan adalah pangkat 2 di C ++?
Jika Anda memiliki prosesor Intel modern dengan Petunjuk Manipulasi Bit , Anda dapat melakukan hal berikut. Ini menghilangkan kode C / C ++ langsung karena orang lain telah menjawabnya, tetapi Anda memerlukannya jika BMI tidak tersedia atau diaktifkan.
bool IsPowerOf2_32(uint32_t x)
{
#if __BMI__ || ((_MSC_VER >= 1900) && defined(__AVX2__))
return !!((x > 0) && _blsr_u32(x));
#endif
}
bool IsPowerOf2_64(uint64_t x)
{
#if __BMI__ || ((_MSC_VER >= 1900) && defined(__AVX2__))
return !!((x > 0) && _blsr_u64(x));
#endif
}
GCC, ICC, dan Clang memberi sinyal dukungan BMI dengan __BMI__
. Ini tersedia di kompiler Microsoft di Visual Studio 2015 dan di atasnya saat AVX2 tersedia dan diaktifkan . Untuk header yang Anda perlukan, lihat File header untuk intrinsik SIMD .
Saya biasanya menjaga _blsr_u64
dengan _LP64_
jika kompilasi pada i686. Clang memerlukan sedikit solusi karena menggunakan simbol intrinsik nam yang sedikit berbeda:
#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
# endif
#endif
Dapatkah Anda memberi tahu saya situs web yang bagus di mana algoritme semacam ini dapat ditemukan?
Situs web ini sering dikutip: Bit Twiddling Hacks .