c++ - What is fastest method to calculate a number having only bit set which is the most significant digit set in another number? -
संभावित डुप्लिकेट:
मुझे क्या चाहिए, मान लें कि कोई संख्या 5
यानी 101
है मेरा जवाब होना चाहिए 100
। 9
या 1001
के लिए, जवाब होना चाहिए 1000
आप मशीन जिस पर यह चलाना है पर प्रतिबंधों के बिना तेज़ अनुक्रम के लिए नहीं पूछ सकता। उदाहरण के लिए, कुछ मशीन "गिन अग्रणी शून्य" नामक एक अनुदेश का समर्थन करते हैं या इसका अर्थ है कि इसे बहुत तेज़ी से अनुकरण करना है यदि आप इस अनुदेश तक पहुंच सकते हैं (उदाहरण के लिए जीसीसी के साथ) तो आप लिख सकते हैं:
#include & lt; limits.h & gt; # शामिल करें & lt; stdint.h & gt; Uint32_t f (uint32_t x) {वापसी ((uint64_t) 1) & lt; & lt; (32 -__ builtin_clz (x) -1); } Int main () {printf ("= & gt;% d \ n", f (5)); printf ( "= & gt;% d \ n", च (9)); }
f (x) आप क्या चाहते हैं (कम से कम वाई x> = y और y = 2 ** n) देता है। कंपाइलर अब लक्ष्य मशीन के लिए इष्टतम कोड अनुक्रम उत्पन्न करेगा। उदाहरण के लिए, जब एक डिफ़ॉल्ट x86_64 आर्किटेक्चर के लिए संकलन करते हैं, तो एफ () इस तरह दिखता है:
bsrl% edi,% edi movl $ 31,% ecx movl $ 1,% eax xorl $ 31,% edi subl % Edi,% ecx salq% cl,% rax ret
आप देख रहे हैं, यहां कोई छोर नहीं! 7 निर्देश, कोई शाखाएं नहीं।
लेकिन अगर मैं अभी (AMD Phenom-II) का उपयोग कर रहा हूं, तो मैं इसके लिए अनुकूलतम करने के लिए अपने कंपाइलर (जीसीसी -4.5) को बताता हूं, तो यह एफ () :
bsrl% edi,% ecx movl $ 1,% eax salq% cl,% rax ret
यह संभवतः इसके लिए जाने का सबसे तेज़ तरीका है मशीन।
संपादित करें: f (0) यूबी के परिणामस्वरूप होता, मैंने तय किया है कि (और विधानसभा)। इसके अलावा, uint32_t का मतलब है कि मैं दोषी महसूस किए बिना 32 लिख सकता हूं: -)
Comments
Post a Comment