C ++ 'da bir sayının 2'nin üssü olup olmadığını test etmenin en basit yolu nedir?
Bit Manipülasyon Talimatlarına sahip modern bir Intel işlemciniz varsa, aşağıdakileri gerçekleştirebilirsiniz. Başkaları zaten yanıtladığı için düz C / C ++ kodunu atlar, ancak BMI mevcut değilse veya etkin değilse buna ihtiyacınız vardır.
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 ve Clang sinyali BMI desteği __BMI__
. AVX2 kullanılabilir ve etkinleştirildiğinde , Visual Studio 2015 ve sonraki sürümlerde Microsoft derleyicilerinde kullanılabilir . İhtiyaç duyduğunuz başlıklar için bkz . SIMD içselleri için başlık dosyaları .
Genellikle i686'da derleyen _blsr_u64
bir _LP64_
in case ile korurum. Clang'ın biraz farklı bir iç sembol adı kullandığı için biraz geçici çözüme ihtiyacı var:
#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
Bana bu tür bir algoritmanın bulunabileceği iyi bir web sitesi söyleyebilir misiniz?
Bu web sitesinde sık sık alıntı yapılır: Bit Twiddling Hacks .