2012-06-15 15 views
5

En küçük tamsayıyı tam olarak bit kümesiyle hesaplamak istiyorum, bu x başka bir tam sayıdan büyük. k=2 için, cevap 1010000 k=4 için olmalı x = 1001010 sonra Örneğin Başka bir tam sayıdan x daha büyük olan k bit kümesiyle en küçük tamsayı hesaplayın x?

, cevap 1001011 olmalı ve k=5 için cevap 1001111

Ben biri en az olarak ayarlamanız gerekir olacağını düşünüyorum x tamsayısında ayarlanan en soldaki bitler gibi birçok bit ve daha sonra, x'da bir sonraki en soldaki ayar bitine bitişik MSB tarafındaki bit ayarını yapmak veya bir sonraki en soldaki ayar bitini ayarlamak arasında seçim yapın ve daha sonra bitleri tekrarlayarak tekrar ayarlamaya bakın. sa işlemek; tüm süre k bitten kalan bit sayılır.

Doğru yaklaşım olup olmadığından emin değilim.

+0

anlamak için soru çok daha kolay hale getirecek örnek giriş/çıkış sağlar. İki tam sayı aynı sayıda bitin olması gerektiği anlamına mı geliyor? – xvatar

+0

@xvatar Sanırım x' ve 'k' programın her iki girdisi, yani' x = 1001010', 'k = 2'' 1010000''yi döndürür – ffao

+2

Bu ödev değil, değil mi? –

cevap

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; 
} 

İkinci döngü optimize edilebilir:

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

Bu ilk döngü sırasında düzgün bir hile. Güzel bitti! – ffao

+0

@ffao: D.Knuth tarafından "Bilgisayar programlama sanatı, vol 4A" da çok sayıda hile var. Veya ["Matters Computational"] 'da (http://www.jjj.de/fxt/#fxtbook). –

+0

@EvgenyKluev Cevabınız ve beni gcc popcnt ile tanıştırdığınız için teşekkür ederiz. Bunu bilmiyordum ve muhtemelen set bitlerini saymak için bir döngü yazmış olurdu. – adi

İlgili konular