[剑指 oferta 15] El número de 1 en binario

Implemente una función, ingrese un número entero y genere el número de 1 en la representación binaria del número. Por ejemplo, si 9 se expresa en binario, es 1001 y 2 bits son 1. Por lo tanto, si ingresa 9, la función genera 2.

Caso de prueba 1:

[剑指 oferta 15] El número de 1 en binario

Caso de prueba 2:
[剑指 oferta 15] El número de 1 en binario

Caso de prueba 3:
[剑指 oferta 15] El número de 1 en binario

Primero, analicemos el problema. Si queremos contar el número de 1 en el sistema binario, lo primero que pensamos es recorrer cada bit de este número, luego juzgarlo como 1count ++ y finalmente devolver el count. Solo escribe el siguiente código

int hammingWeight(uint32_t n) {
        int count = 0;
        while(n)
        {
            if(n&1)
                count++;

            //此处移位时,如果n为负数可能会导致死循环
            n >>= 1;
        }
        return count;
    }

El código anterior es correcto cuando se cuentan números sin signo, pero cuando se cuentan números negativos, puede causar un bucle sin fin.
Aquí utilizamos operaciones de bits en lugar de operaciones de división, porque la eficiencia de la división en las computadoras es mucho menor que la de las operaciones de turno. Deberíamos hacer todo lo posible para reemplazar la multiplicación y la división con operadores de cambio en la programación real.
A continuación, analicemos el número negativo de casos de prueba. La característica del operador de desplazamiento a la derecha es que cuando se desplaza a la derecha n bits, se descartarán los n bits situados más a la derecha. La situación de procesar el bit más a la izquierda en el desplazamiento a la derecha es más complicada. Si el número es un valor sin signo, use 0 para llenar los n bits más a la izquierda; si el número es un número con signo, use el bit de signo del número para llenar los n bits más a la izquierda. Es decir, si el número fue originalmente positivo, luego de desplazarse hacia la derecha, agregue n ceros a la izquierda; si el número fue originalmente negativo, agregue n 1s a la izquierda después de desplazarse hacia la derecha. Por lo tanto, cuando se cambia el número negativo, el resultado final queda atrapado en un bucle sin fin porque el bit más alto siempre se complementa con 1. Por lo tanto, el diseño del código anterior se debe a un problema y podemos ajustarlo.

  • Demostración correcta 1:
int hammingWeight(uint32_t n) {
        int count = 0;
        unsigned int flag = 1;
        while(flag)
        {
            if(n&flag)
                count++;

            flag = flag << 1;
        }
        return count;
    }

Para evitar bucles infinitos, aquí no desplazamos el número de entrada n a la derecha, sino AND n y 1 bit a bit para determinar si el bit más bajo de i es 1, luego desplazamos i 1 bit a la izquierda, y luego lo hacemos bit a bit con n Y funcionamiento. De esta manera, el número de bits binarios 1 en n se puede calcular desplazándose repetidamente a la derecha. La única desventaja de esta solución es que no importa cuántos 1 haya en los dígitos binarios de n, se requieren 32 ciclos. Entonces, ¿podemos optimizarlo? La respuesta es sí, echemos un vistazo a la respuesta final más perfecta:
la respuesta perfecta:

int hammingWeight(uint32_t n) {
        int count = 0;
        while(n)
        {
            ++count;
            n = (n-1)&n;
        }
        return count;
    }

La flexibilidad de la operación de bits se refleja aquí en el mecanismo, y se puede ver que el diseño del código es muy ingenioso y conciso. La esencia radica en esta frase n = (n-1)&n. Todos pueden experimentar la maravillosa pluma aquí.

Supongo que te gusta

Origin blog.51cto.com/14289099/2546327
Recomendado
Clasificación