Al escribir leetcode, me he encontrado con varios problemas que necesitan encontrar rápidamente el número 1 en una secuencia binaria, así que aquí hay un resumen de varios métodos.
Juicio bit a bit
Esta es la forma más sencilla e intuitiva de determinar si cada dígito de un número entero es 1 a su vez.
Juzgar el primer bit: n & 1
Juzgar el segundo bit: n & (1 << 1)
Juzgar el enésimo bit: n & (1 << (n-1))
class Solution {
public:
int hammingWeight(uint32_t n) {
int ret = 0;
for (int i = 0; i < 32; i ++) {
if (n & (1 << i)) {
ret ++;
}
}
return ret;
}
};
Método de acceso directo: N & (N-1)
El uso de este método se basa en el hecho:
一个数 n 与一个比它小 1 的数(n−1)进行与运算(&)之后,得到的结果会消除 n 中最低位的 1
。
Por ejemplo:
7 y 6
00111 y 00110 = 00110
Puede verse que el resultado de n & (n − 1) es el valor después de reemplazar el bit más bajo de n con 0.
Este algoritmo se usa para eliminar 1 cada vez, y el contador es +1 cada vez hasta que n es 0.
class Solution {
public:
int hammingWeight(uint32_t n) {
int res = 0;
while (n) {
n = n&(n - 1);
res++;
}
return res;
}
};