यह जांचने का सबसे सरल तरीका है कि क्या कोई संख्या C ++ में 2 की शक्ति है?
यदि आपके पास बिट मैनिपुलेशन निर्देश के साथ एक आधुनिक इंटेल प्रोसेसर है , तो आप निम्नलिखित कार्य कर सकते हैं। यह सीधे C / C ++ कोड को छोड़ देता है क्योंकि अन्य लोग पहले ही इसका उत्तर दे चुके हैं, लेकिन बीएमआई उपलब्ध या सक्षम नहीं होने पर आपको इसकी आवश्यकता है।
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
}
जीसीसी, आईसीसी और क्लैंग सिग्नल बीएमआई के साथ समर्थन करते हैं __BMI__
। यह Visual Studio 2015 और इसके बाद के संस्करण में AVX2 उपलब्ध और सक्षम होने पर Microsoft कंपाइलर में उपलब्ध है । आपके द्वारा आवश्यक हेडर के लिए, SIMD आंतरिक के लिए हेडर फ़ाइलें देखें ।
मैं आमतौर पर i686 पर संकलित मामले के _blsr_u64
साथ गार्ड करता हूं _LP64_
। क्लैंग को थोड़ा वर्कअराउंड की आवश्यकता होती है क्योंकि यह एक अलग आंतरिक आंतरिक प्रतीक नाम का उपयोग करता है:
#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
क्या आप मुझे एक अच्छी वेब साइट बता सकते हैं जहाँ इस तरह का एल्गोरिदम मिल सकता है?
इस वेबसाइट को अक्सर उद्धृत किया जाता है: बिट ट्विडलिंग हैक्स ।