Directorio de artículos
1. Descripción
Escribe una función, la entrada es un entero sin signo, devuelve el número de dígitos en la expresión binaria de '1' (también conocido como peso de Hamming).
2. Ejemplo
Entrada: 00000000000000000000000000001011
Salida: 3
Explicación: En la cadena binaria de entrada 00000000000000000000000000001011, un total de tres bits son '1'.
Entrada: 00000000000000000000000010000000
Salida: 1
Explicación: En la cadena binaria de entrada 00000000000000000000000010000000, un total de un bit es '1'.
Entrada: 11111111111111111111111111111101
Salida: 31
Explicación: En la cadena binaria de entrada 11111111111111111111111111111101, un total de 31 bits son '1'.
rápido
- Tenga en cuenta que en algunos lenguajes (como Java), no hay ningún tipo de entero sin signo. En este caso, tanto la entrada como la salida se designarán como tipos de enteros con signo y no deberían afectar su implementación, porque la representación binaria interna es la misma independientemente de si el entero tiene o no signo.
- En Java, el compilador usa la notación de complemento a dos para representar enteros con signo. Por lo tanto, en el ejemplo 3 anterior, la entrada representa un entero con signo -3.
3. Análisis
Un entero positivo es 3 y su representación binaria es "0000 0011". Realice la operación 3 & (3-1) en 3, como se muestra en la siguiente tabla
operando | Representación entera | Representación binaria |
---|---|---|
3 | 0000 0011 | |
Y | 3 -1 = 2 | 0000 0010 |
= | 2 | 0000 0010 |
Continúe realizando la operación 2 & (2-1) en el resultado 2 de 3 & (3-1),
operando | Representación entera | Representación binaria |
---|---|---|
2 | 0000 0010 | |
Y | 2 -1 = 1 | 0000 0001 |
= | 0 | 0000 0000 |
Al observar las dos tablas anteriores, podemos sacar una conclusión preliminar: hay 2 1 en la representación binaria de 3, y después de 2 operaciones &, el resultado es 0.
Tomemos otro ejemplo de números negativos.
Un número negativo es (-125) y su representación binaria es "1000 0011".
Realice la operación (-125) y (-125-1) en (-125), el proceso se muestra en la siguiente tabla,
operando | Representación entera | Representación binaria |
---|---|---|
-125 | 1000 0011 | |
Y | -125-1 = -126 | 1000 0010 |
= | -126 | 1000 0010 |
Continúe realizando la operación & en el resultado (-126) de (-125) y (-125-1), el proceso se muestra en la siguiente tabla,
operando | Representación entera | Representación binaria |
---|---|---|
-126 | 1000 0010 | |
Y | -126-1 = -127 | 1000 0001 |
= | -128 | (1) 1000 0000 |
Continúe realizando la operación & en el resultado (-128) de (-126) y (-126-1), el proceso se muestra en la siguiente tabla,
operando | Representación entera | Representación binaria |
---|---|---|
-128 | (1) 1000 0000 | |
Y | -128-1 = -129 | (1) 0111 1111 |
= | 0 | 0000 0000 |
Observando estas tres tablas, también podemos sacar una conclusión: (-125) el binario tiene 3 1. Después de 3 operaciones &, el resultado es 0.
Conclusión:
entero nnEl número de 1 en la cadena binaria de n , igualannn & (nnn -1) El número de operaciones.
4. Código
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int numOneBits = 0;
while(n != 0)
{
n = n & (n - 1);
++numOneBits;
}
return numOneBits;
}
}
Pero hay un código más simple:
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
return Integer.bitCount(n);
}
}
5. Verificación
6. Fuente
- LeetCode 191. Número de bits 1
Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/number-of-1-bits Los
derechos de autor son propiedad de Leetcode Network.