2012-06-15 16 views
5

मैं बिल्कुल k बिट्स सेट के साथ सबसे छोटे पूर्णांक की गणना करना चाहता हूं, जो कि एक और पूर्णांक x से अधिक है।के बिट्स सेट के साथ सबसे छोटे पूर्णांक की गणना करें जो कि किसी अन्य पूर्णांक x से अधिक है?

उदाहरण के लिए यदि x = 1001010 तो k=2 के लिए, इस सवाल का जवाब 1010000 k=4 के लिए होना चाहिए, इस सवाल का जवाब 1001011 होना चाहिए और k=5 के लिए जवाब 1001111

मुझे लगता है कि कम से कम के रूप में स्थापित करने की आवश्यकता होगी है x पूर्णांक में सेट किए गए बाएं सबसे बिट्स के रूप में कई बिट्स, और उसके बाद x में अगले बाएं सेट सेट बिट के आस-पास एमएसबी-साइड बिट सेट करने के बीच चुनें, या अगले बाएं सेट सेट बिट को सेट करें और उसके बाद बिट्स को दोहराने के बाद सेट करें एस मुझे प्रक्रिया; सभी के दौरान छोड़ दिया बिट्स गिनती।

मुझे यकीन नहीं है कि यह सही दृष्टिकोण है या नहीं।

+0

नमूना इनपुट/आउटपुट उपलब्ध कराने के अपने प्रश्न और अधिक समझने में अधिक आसान कर देगा। क्या आपका मतलब है कि दो पूर्णांकों में बिट्स की संख्या समान होनी चाहिए? – xvatar

+0

@xvatar मुझे लगता है कि 'x' और 'k' प्रोग्राम के लिए दोनों इनपुट हैं, यानी,' x = 1001010',' k = 2' '1010000' – ffao

+2

वापस लौटाएगा यह होमवर्क नहीं है, है ना? –

उत्तर

6
++x; 

while (popcnt(x) > k) 
{ 
    // Substitute the least-significant group of bits 
    // with single bit to the left of them 
    x |= x-1; 
    ++x; 
} 

unsigned bit = 1; 
while (popcnt(x) < k) 
{ 
    x |= bit; 
    bit <<= 1; 
} 

दूसरा पाश अनुकूलित किया जा सकता है:

for (i = k - popcnt(x); i != 0; --i) 
{ 
    // Set the lowest non-set bit 
    x |= x+1; 
} 
+0

वह पहला जबकि लूप एक साफ चाल है। अच्छी तरह से किया! – ffao

+0

@ffao: डी। कुथ द्वारा "कंप्यूटर प्रोग्रामिंग की कला, वॉल 4 ए" में ऐसी कई चालें हैं। या ["मैटर्स कम्प्यूटेशनल"] में (http://www.jjj.de/fxt/#fxtbook)। –

+0

@EvgenyKluev उत्तर के लिए धन्यवाद और मुझे gcc popcnt में पेश करने के लिए धन्यवाद। मुझे इसके बारे में पता नहीं था और शायद सेट बिट्स गिनने के लिए एक लूप लिखा होगा। – adi