Niuke de hoy == Número de 1 en binario == Operación de cambio binario del complemento original

Fuente: Niuke https://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8?tpId=188&&tqId=36702&rp=1&ru=/ta/job-code-high-week&qru=/ta/job-code-high-week/question
declaración: Si violé los derechos de alguien, comuníquese conmigo y lo eliminaré.
Bienvenidos expertos para rociarme

Número de 1 en el título binario

Descripción del título
Introduzca un número entero y emita el número de unos en la representación binaria de 32 bits del número. El número negativo está representado por complemento.
Ingrese 10 y
devuelva el valor 2

== Los ejemplos aquí no están completos, faltan números negativos ==
Ejemplos que agregué yo mismo:

Entrada-1 salida 32
entrada-2147483648 salida 1

Gran código de Dios:

Solo una oración: es decir, n & (n-1) eliminará el 1 más a la derecha de n (es decir, el primer 1 de derecha a izquierda). En el ciclo, elimine un 1 de n cada vez y salga si no hay 1 cuando n == 0

Por ejemplo:
un número binario n = 1100.
Después de restar 1 de n, n-1 = 1011, el tercer bit se convierte en 0, los dos ceros detrás de él se convierten en 1 y el primer 1 permanece sin cambios.
Encontramos que el resultado de restar 1 es cambiar el de la derecha. Todos los bits comienzan con 1 están invertidos.
Repita n & (n-1) y todos los bits del 1 más a la derecha del entero original se convertirán en 0. Por ejemplo, 1100 y 1011 = 1000. En
otras palabras, restar 1 de un entero y hacer la operación AND con el entero original cambiará el 1 del extremo derecho del entero a 0. Entonces hay tantos unos en el binario de un entero como sea posible. Tales operaciones.

public int NumberOf1(int n) {
    
      
      int ans = 0;
        while (n != 0) {
    
    
            ++ans;
            n = n & (n-1);
        }
        return ans;
    }
La idea general es calcular si cada bit es 1

Lo que se usa aquí es >>> desplazamiento a la derecha sin signo, es decir, si es positivo o negativo, se llena con 0

    public int NumberOf1(int n) {
    
    
        int count = 0;
        while(n != 0){
    
    
            count += (n & 1); //每次判断最低位是否为1
            n >>>= 1;
        }
        return count;
    }
Habla un poco sobre esto y el de Java binary
Código original y complemento
  • El binario de un número positivo es el código original, es decir, 3 = 011
  • El binario del número negativo es el código de complemento, es decir, el bit de signo permanece sin cambios y el código original se invierte y se suma 1 para obtener el código de complemento, es decir -3 = 1 1101
  • String string = Integer.toBinaryString (n); Use esta operación en java para obtener la representación binaria de n:
  • Como se muestra en la figura siguiente, el 0 más a la izquierda se omite aquí. Inserte la descripción de la imagen aquí
Desplazamiento binario >>, <<, >>>

Aquí está la operación de cambio, echemos un vistazo a la operación de cambio binario >>, <<, >>>, <<< (la clave esDesplazamiento negativoEs un poco especial) porque el signo de un número negativo está en el extremo izquierdo, es un poco ...

  • << desplazarse hacia la izquierda, el final del binario se llena directamente con 0, no hay diferencia entre positivo y negativo, porque aquí todos están llenos de 0, y porque el bit de signo del número negativo está en el extremo izquierdo
  • >> Desplazar a la derecha, hay dos casos: el principio se completa con el bit de signo
    • Los números negativos se complementan con 1, por ejemplo, el valor binario de -5 es 1111… 1011, desplaza dos bits hacia la derecha 1111… 10
    • Comience con 0 para completar el número positivo
  • >>> es una operación de cambio sin firmar, ya sea que se complete a la derecha o a la izquierda, use 0
  • <<< No existe tal operación, Por qué, no hay diferencia entre desplazamiento a la derecha sin firmar y <<

int n = 5;
int m = -5;
System.out.println ("n 的 二进制:" + Integer.toBinaryString (n));
System.out.println ("m 的 二进制:" + Integer.toBinaryString (m));
System.out.println ("n >> 2:" + Integer.toBinaryString ((n >> 2)));
System.out.println ("m >> 2:" + Integer.toBinaryString ((m >> 2)));
System.out.println ("n << 2:" + Integer.toBinaryString ((n << 2)));
System.out.println ("m << 2:" + Integer.toBinaryString ((m << 2)));
System.out.println ("n >>> 2:" + Integer.toBinaryString ((n >>> 2)));
System.out.println ("m >>> 2:" + Integer.toBinaryString ((m >>> 2)));
Inserte la descripción de la imagen aquí

Precedencia con operadores binarios

Inserte la descripción de la imagen aquí

Blog de referencia

Complemento y código inverso en Java:
https://blog.csdn.net/weixin_37870009/article/details/79775926?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=dislevantte.nonepc_relevant. -tarea-blog-BlogCommendFromBaidu-1.control

Código original de Java, código inverso, cálculo de complemento e inversión (~) operación:
https://blog.csdn.net/u010841296/article/details/52850307

Resumen de operadores que operan binarios en java (&, |, ^, ~, <<, >>, >>>):
https://blog.csdn.net/xinghuo0007/article/details/78453442

Resuma las operaciones de bits en java y la prioridad de las operaciones:
https://blog.csdn.net/sadjladjlas/article/details/51192106

Notas de estudio de Java: obtenga el código original de números positivos y el complemento de números negativos:
https://blog.csdn.net/u010503427/article/details/79631121

Supongo que te gusta

Origin blog.csdn.net/qq_45531729/article/details/110949414
Recomendado
Clasificación