Jaki jest najprostszy sposób sprawdzenia, czy liczba jest potęgą 2 w C ++?
Jeśli masz nowoczesny procesor Intel z instrukcjami manipulacji bitami , możesz wykonać następujące czynności. Pomija prosty kod C / C ++, ponieważ inni już na niego odpowiedzieli, ale potrzebujesz go, jeśli BMI nie jest dostępny lub włączony.
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
}
Obsługa BMI sygnałów GCC, ICC i Clang z __BMI__
. Jest dostępny w kompilatorach Microsoft w programie Visual Studio 2015 i nowszych, gdy AVX2 jest dostępny i włączony . Aby uzyskać potrzebne nagłówki, zobacz Pliki nagłówkowe dla elementów wewnętrznych SIMD .
Zwykle chronię _blsr_u64
to _LP64_
w przypadku kompilacji na i686. Clang wymaga małego obejścia, ponieważ używa nieco innej wewnętrznej nazwy symbolu:
#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
Czy możesz mi podać dobrą stronę internetową, na której można znaleźć tego rodzaju algorytm?
Ta strona jest często cytowana: Bit Twiddling Hacks .