मैं लंबे समय तक निम्नतम आदेश बिट की अनुक्रमणिका प्राप्त करने का सबसे तेज़ तरीका ढूंढना चाहता हूं। अर्थात्:सबसे कम ऑर्डर बिट का सूचकांक
00101001001000 -> 3
पाशन और स्थानांतरण शामिल समाधान बहुत धीमी गति से कर रहे हैं। अर्थात्:
int i;
if(bits == 0ULL) {
i = 64;
} else {
for(i = 0;!(bits & 1ULL);i++)
bits >>= 1;
}
संपादित करें: उपयोग
समारोह ffsll वास्तव में इसके उपयोग को कम नहीं कर सकते हैं का उपयोग करता है, लेकिन यहाँ यह (बेशक सरलीकृत) है पर जानकारी। यह सिर्फ सूचकांक के माध्यम से पुनरावृत्त करता है और उनके साथ कुछ करता है। यह फ़ंक्शन शायद अपने पूरे एप्लिकेशन में सबसे अधिक व्यापक रूप से उपयोग किया जाने वाला फ़ंक्शन है, इसके मूल्य के बहुत सारे कैशिंग के बावजूद। यह मेरे alpha-beta खोज इंजन में एक कानूनी चाल जनरेटर है।
while(bits){
index = ffsll(bits);
doSomething(index);
index &= index-1;
}
इसका मतलब क्या है "बहुत धीमी"? पूरे चलने वाले समय से कितना प्रतिशत लगता है? – sambowry
यह कोड 7.2secs में मेरे बेंचमार्क में चलाता है जहां ffsll 0.2secs में चलता है। यह एक 97% कमी है। बहुत धीमी गति से;) – dharga
एक पुस्तकालय समारोह का उपयोग कर के लिए http://stackoverflow.com/questions/757059/position-of-least-significant-bit-that-is-set –