কিছু অতি জটিল উত্তর। ডাবরুইন কৌশলটি কেবল তখনই ব্যবহার করা উচিত যখন ইনপুটটি ইতিমধ্যে দু'জনের শক্তি, অন্যথায় আরও ভাল উপায় আছে। 2 ইনপুট পাওয়ারের জন্য, _BitScanReverse
আমি পরীক্ষিত যে কোনও প্রসেসরের তুলনায় ডাবরুইন হ'ল পরম দ্রুততম । তবে সাধারণ ক্ষেত্রে _BitScanReverse
(বা আপনার সংকলকটিতে যা কিছু অন্তর্নিহিত বলা হয়) দ্রুততম (নির্দিষ্ট সিপিইউতে এটি মাইক্রোকোড করা যেতে পারে)।
যদি অভ্যন্তরীণ ফাংশন কোনও বিকল্প না হয় তবে সাধারণ ইনপুটগুলি প্রক্রিয়াকরণের জন্য এখানে একটি অনুকূল সফ্টওয়্যার সমাধান রয়েছে।
u8 inline log2 (u32 val) {
u8 k = 0;
if (val > 0x0000FFFFu) { val >>= 16; k = 16; }
if (val > 0x000000FFu) { val >>= 8; k |= 8; }
if (val > 0x0000000Fu) { val >>= 4; k |= 4; }
if (val > 0x00000003u) { val >>= 2; k |= 2; }
k |= (val & 2) >> 1;
return k;
}
মনে রাখবেন যে এই সংস্করণটির শেষে অন্যান্য উত্তরগুলির চেয়ে পৃথকভাবে কোনও দেবুউইন লুকের প্রয়োজন নেই। এটি জায়গায় অবস্থান গণনা করে।
টেবিলগুলি বেশি পছন্দনীয় হতে পারে, আপনি যদি এটিকে বারবার পর্যাপ্ত পরিমাণে কল করেন তবে কোনও টেবিলের গতিবেগের ফলে ক্যাশে মিসের ঝুঁকি গ্রহন হয়ে যায়।
u8 kTableLog2[256] = {
0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
};
u8 log2_table(u32 val) {
u8 k = 0;
if (val > 0x0000FFFFuL) { val >>= 16; k = 16; }
if (val > 0x000000FFuL) { val >>= 8; k |= 8; }
k |= kTableLog2[val]; // precompute the Log2 of the low byte
return k;
}
এটি এখানে প্রদত্ত যে কোনও সফ্টওয়্যার উত্তরের সর্বাধিক থ্রুপুট উত্পাদন করতে হবে, তবে আপনি যদি মাঝে মাঝে এটি কল করেন তবে আমার প্রথম স্নিপেটের মতো একটি টেবিল-মুক্ত সমাধান পছন্দ করুন।