সংখ্যাটি সি ++ তে 2 এর শক্তি কিনা তা পরীক্ষা করার সহজ উপায় কী?
যদি আপনার কাছে বিট ম্যানিপুলেশন নির্দেশাবলী সহ একটি আধুনিক ইন্টেল প্রসেসর থাকে তবে আপনি নিম্নলিখিতগুলি সম্পাদন করতে পারেন। এটি সরল সি / সি ++ কোড বাদ দেয় কারণ অন্যরা ইতিমধ্যে এর উত্তর দিয়েছে, তবে বিএমআই উপলব্ধ না থাকলে বা সক্ষম না থাকলে আপনার এটি দরকার।
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
}
জিসিসি, আইসিসি এবং ক্ল্যাং সংকেত দিয়ে বিএমআই সমর্থন করে __BMI__। এটি যখন মাইক্রোসফ্ট সংকলকগুলিতে ভিজ্যুয়াল স্টুডিও 2015 এবং তারপরে AVX2 উপলভ্য থাকে এবং সক্ষম হয় তখন তা উপলব্ধ । আপনার যে শিরোনামের প্রয়োজন হবে সেগুলির জন্য সিমডি অন্তর্ভুক্তির জন্য শিরোনাম ফাইলগুলি দেখুন ।
আমি সাধারণত পাহারা _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
আপনি কি আমাকে একটি ভাল ওয়েবসাইট বলতে পারেন যেখানে এই ধরণের অ্যালগরিদম পাওয়া যাবে?
এই ওয়েবসাইটটি প্রায়শই উদ্ধৃত করা হয়: বিট টুইডলিং হ্যাকস ।