कुछ अति जटिल जवाब यहाँ। डेब्यू तकनीक का उपयोग केवल तब किया जाना चाहिए जब इनपुट पहले से ही दो की शक्ति है, अन्यथा एक बेहतर तरीका है। 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;
}
यह यहां दिए गए किसी भी सॉफ़्टवेयर उत्तर के उच्चतम थ्रूपुट का उत्पादन करना चाहिए, लेकिन यदि आप इसे कभी-कभी कहते हैं, तो मेरी पहली स्निपेट की तरह तालिका-मुक्त समाधान पसंद करें।