2012-06-15 24 views
5

Quiero calcular el número entero más pequeño con exactamente k bits establecidos, que es mayor que otro número entero x.Calcular el entero más pequeño con k bits conjunto que es mayor que otro entero x?

Por ejemplo, si x = 1001010 continuación para k=2, la respuesta debería ser 1010000 para k=4, la respuesta debería ser 1001011 y para k=5 la respuesta es 1001111

creo que uno tenga que configurar al menos tan muchos bits como los bits más a la izquierda establecidos en el entero x, y luego elija entre configurar el bit del lado MSB adyacente al siguiente bit configurado más a la izquierda en x, o establecer el siguiente bit establecido más a la izquierda y luego ver los siguientes bits repitiendo el sa mi proceso; todo el tiempo contando los bits que quedaron fuera de la k.

No estoy seguro de si este es el enfoque correcto.

+0

proporcionar la muestra de entrada/salida hará que su pregunta mucho más fácil de entender. ¿Quiere decir que los dos enteros deberían tener el mismo número de bits establecidos? – xvatar

+0

@xvatar Creo que 'x' y' k' son ambas entradas para el programa, es decir, 'x = 1001010',' k = 2' devolvería '1010000' – ffao

+2

Esto no es tarea, ¿verdad? –

Respuesta

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

segundo bucle puede ser optimizado:

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

Ese primer ciclo while es un truco perfecto. ¡Bien hecho! – ffao

+0

@ffao: hay muchos trucos en "El arte de la programación de computadoras, vol 4A" de D.Knuth. O en ["Matters Computational"] (http://www.jjj.de/fxt/#fxtbook). –

+0

@EvgenyKluev Gracias por la respuesta y por presentarme a gcc popcnt. No sabía nada de eso y probablemente habría escrito un ciclo para contar los bits establecidos. – adi

Cuestiones relacionadas