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
Directorio de artículos
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í.
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)));
Precedencia con operadores binarios
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