परंपरागत तरीके से
int count = 32;
for(int i = 1 << 31; i != 0; i >>= 1, count--)
if((number & i) != 0) return count;
आप अनुकूलन के साथ और अधिक कल्पना कर सकते हैं।
EDIT 2 बिट स्कैन रिवर्स ऑपोड के उपयोग के बिना मैं सबसे तेज़ कोड सोच सकता हूं। आप एक बड़ी (256 प्रविष्टि) LUT का उपयोग कर सकते हैं और अंतिम IF कथन को हटा सकते हैं। मेरे परीक्षण में यह बार-बार OR-SHIFT से तेज़ था, फिर LUT विधि किसी अन्य पोस्ट में वर्णित है।
int[] Log2_LUT = new int[16]{0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4};
int Log2 (number) {
int count = 0;
if((number & 0xFFFF0000) != 0) {
number >>= 16;
count += 16;
}
if((number & 0x0000FF00) != 0) {
number >>= 8;
count += 8
}
if((number & 0x000000F0) != 0) {
number >>= 4;
count += 4;
}
return count + Log2_LUT[number];
}
या अगर अपने 86 या x86-64 बिट संरचना आप बीएसआर (बिट स्कैन रिवर्स) opcode का उपयोग कर सकते है। आप C++ आंतरिक पा सकते हैं के लिए यह http://msdn.microsoft.com/en-us/library/fbxyd7zd%28v=vs.80%29.aspx
इसके अलावा, आप सवाल यह एक What is the fastest way to calculate the number of bits needed to store a number
संपादित के समान है क्यों log2 जवाब इष्टतम नहीं हैं ... जबकि गणितीय सही, जटिल चल बिन्दु आपरेशनों (साइन, कोसाइन, तन, लॉग) आधुनिक कंप्यूटर पर सबसे धीमे प्रदर्शन कर रहे हैं। यह एक फ्लोट में पूर्णांक को परिवर्तित करने और इसे छत/मंजिल के साथ जोड़कर मिश्रित किया जाता है।
स्रोत
2012-01-24 17:27:54
आप मूल रूप से करना चाहते हैं [गणना प्लस्तर लगाना (log2 (एन))] (http://stackoverflow.com/questions/3272424/compute-fast-log-base-2-ceiling), जो पहले ही यहां पूछा जा चुका है। –
_BitScanReverse (एमएसवीसी) या समकक्ष। सबसे तेज़ तरीके से पूछते समय फ़्लोटिंग पॉइंट लॉगरिदम की गणना करने वाली कुछ भी तुरंत अयोग्य हो जाती है। – harold
सबसे तेज़ तरीका प्रोसेसर पर निर्भर करेगा, लेकिन आप जीसीसी और एमएस समाधान ढूंढ सकते हैं जो यहां एक सीपीयू निर्देश का उपयोग करेंगे: http://stackoverflow.com/questions/3272424/compute-fast-log-base-2-ceiling –