วิธีที่ง่ายที่สุดในการทดสอบว่าตัวเลขเป็นเลขยกกำลัง 2 ใน C ++ อย่างไร
หากคุณมีโปรเซสเซอร์ Intel ที่ทันสมัยพร้อมคำแนะนำในการจัดการบิตคุณสามารถดำเนินการดังต่อไปนี้ มันละเว้นรหัส C / C ++ ตรงเพราะคนอื่นตอบไปแล้ว แต่คุณต้องใช้ถ้า BMI ไม่พร้อมใช้งานหรือเปิดใช้งาน
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 และ Clang signal BMI รองรับด้วย__BMI__
. มันมีอยู่ในคอมไพเลอร์ไมโครซอฟท์ใน Visual Studio 2015 และสูงกว่าเมื่อAVX2 สามารถใช้ได้และเปิดใช้งาน สำหรับส่วนหัวที่คุณต้องการโปรดดูที่ไฟล์ส่วนหัวสำหรับ SIMD ภายในintrinsics
ฉันมักจะป้องกัน_blsr_u64
ด้วย_LP64_
ในกรณีที่รวบรวมบน i686 เสียงดังต้องการวิธีแก้ปัญหาเล็กน้อยเนื่องจากใช้ชื่อสัญลักษณ์ภายในที่แตกต่างกันเล็กน้อย:
#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
คุณช่วยบอกฉันได้ไหมว่ามีเว็บไซต์ดีๆที่สามารถหาอัลกอริทึมประเภทนี้ได้
เว็บไซต์นี้มักจะอ้าง: Bit twiddling Hacks