Tabla de contenido
1: Primero, se presentarán las funciones y propiedades de los tres operadores I y ^.
El enlace del tema es el siguiente:
1:136. Números que aparecen sólo una vez - LeetCode
2: La espada se refiere a la Oferta 15. El número de unos en binario - LeetCode
El artículo comienza oficialmente ~~~
1: operador de bits ^ (bit a bit exclusivo o) & (bit a bit y) | (bit a bit o)
En primer lugar, debemos comprender el significado de este bit en el operador de bits : este bit es en realidad lo que normalmente llamamos un bit binario, por lo que los operadores de bits se utilizan para realizar operaciones en bits binarios (que solo contienen 0 y 1).
& : El nombre de este operador es bit a bit y, no lo confundas con el operador && (lógico o), la función de & es poner los bits binarios de ambos operandos a 1, y los demás bits son 1. Si hay es 0 o 1, se convertirá en 0. (La comprensión simple es: solo 1 es 1; de lo contrario, el valor de este bit es 0).
Por ejemplo: 3 y 5
3&5
假设在32位平台下
3的二进制位:00000000 00000000 00000000 00000011
5的二进制位:00000000 00000000 00000000 00000101
3&5 00000000 00000000 00000000 00000001
全1才为1,其它都为0
|(OR bit a bit) : este operador tiene el mismo efecto que el operador anterior, excepto que su función es opuesta a &. Solo todos los ceros en el bit binario son 0 y 1 es 1.
El resultado de 3|5 es el siguiente:
3|5
假设在32位平台下
3的二进制位:00000000 00000000 00000000 00000011
5的二进制位: 00000000 00000000 00000000 00000101
3|5的结果 00000000 00000000 00000000 00000111
^XOR bit a bit: el mismo bit binario es 0 y el diferente es 1. Al mismo tiempo, el operador ^ tiene las características de ley conmutativa y ley asociativa, por ejemplo: a^a=0 porque todos los bits binarios son lo mismo a^0 =a ;0 no cambiará su bit original a^ b^a=b, aquí refleja su naturaleza, que es equivalente a a^a^ b.
Los puntos de conocimiento han sido pavimentados, entremos en la explicación de los ejercicios.
2: Preguntas de prueba escrita clásicas (operaciones de bits)
¡La dificultad de las preguntas varía de fácil a difícil!
1: 136. Números que aparecen sólo una vez - LeetCode
Esta pregunta también se puede llamar el problema del perro único (perro)
En primer lugar, el significado de este tema es: danos una matriz, y luego hay un número en la matriz que solo aparece una vez y los otros números aparecen dos veces.
Aquí podemos pensar en la naturaleza del operador ^ del que hablamos anteriormente : a^a=0;0^a=a;
Debido a que hay números en la matriz que aparecen dos veces , entonces podemos eliminar los dos números idénticos después de usar ^ , y el número que queda en la matriz final es el único número que aparece una vez.
código:
int singleNumber(int* nums, int numsSize){
int ret =0;
int i =0;
for(i=0;i<numsSize;i++)
{
ret^=nums[i];
}
return ret;
}
Esta pregunta utiliza el operador ^ de manera muy inteligente. Por supuesto, puede haber otros algoritmos para esta pregunta, como ordenar y contar, tablas hash ... todos se pueden usar para implementar este algoritmo. Pero como estamos hablando de operadores bit a bit, utilizamos operadores bit a bit.
2: Espada se refiere a la Oferta 15. El número de unos en binario
Usaré dos soluciones a esta pregunta para explicar esta pregunta:
Método 1: operador de turno más y operador + recuento
Idea: Supongamos que conocemos un número porque solo el 1 bit más a la derecha es 1 y los otros bits son 0, por lo que realizamos & operación con 1 por cada 1 bit del bit binario del número a calcular.
código:
int hammingWeight(uint32_t n) {
int count=0;
int i =0;
for(i=0;i<32;i++)
{
if(((n>>i)&1)==1)
count++;
}
return count;
}
Método 2: Elimina el 1 del último dígito del número que necesitamos y continúa el ciclo.
Idea: n=n&(n-1);
Pongamos un ejemplo para explicarlo:
Código:
int hammingWeight(uint32_t n) {
int count=0;
while(n)
{
count++;
n=n&(n-1);
}
return count;
}
3: La espada se refiere a la Oferta 56 - I. La cantidad de veces que aparece el número en la matriz - LeetCode
En comparación con las dos preguntas anteriores, esta pregunta tiene cierto grado de dificultad y no es tan directa como las dos preguntas anteriores:
Expliquemoslo a través de Liezi real.
La idea que usamos aquí es el grupo XOR.
Entonces, ¿qué es el grupo XOR?
Por ejemplo, podemos poner 1 1 3 3 5 en una matriz y 2 2 4 4 6 en otra matriz, de modo que podamos obtener 5 y 6 aplicando XOR en cada matriz.
Entonces, ¿cómo agrupamos?
En primer lugar, aplicamos XOR a todos los números en la matriz para obtener 5^6, y debido a que los dos números no pueden ser iguales, el XOR definitivamente no es 1, entonces uno de los dígitos binarios en el resultado debe ser 1, entonces Puedes usar este 1 para agrupar.
Por ejemplo, 5^6
Debido a que 5 y 6 son diferentes en este bit, colocamos el número que es igual a 5 en este bit en un grupo, y colocamos el número que es diferente de 5 en otra matriz, y luego XOR respectivamente para obtener la respuesta. depende.
Entonces, ¿cómo saber qué bit es diferente entre 5 y 6?
Primero, hacemos XOR en toda la matriz para obtener el valor ^ de 5 y 6 , y luego realizamos una operación & en cada bit de este valor con 1. Si el resultado de encontrar 1 bit & es 1, entonces podemos marcar esta posición , y luego dejamos que cada valor en nuestra matriz original mueva el bit pos. Si es & igual a 1, usamos dog1 para ^ subirlo, si no es igual a 1, entonces usamos dog2 para ^ subir
Entonces, al final, nuestro perro1 es uno de los valores y perro2 es el segundo valor.
código:
int* singleNumbers(int* nums, int numsSize, int* returnSize){
int*ret=(int*)malloc(sizeof(int)*2);
int i =0;
int pos=0;
int a=0;
for(i=0;i<numsSize;i++)
{
a^=nums[i];
}
//a现在为两个数字的异或值 a^b!=0
//标记那个位置为1
for(i=0;i<32;i++)
{
if(a>>i&1==1)
{
pos=i;
break;
}
}
int dog1=0;
int dog2=0;
//根据pos位置分为两个数组,直接异或就是我们所需要的答案了
for(i=0;i<numsSize;i++)
{
if((nums[i]>>pos)&1==1)
{
dog1^=nums[i];
}
else
{
dog2^=nums[i];
}
}
ret[0]=dog1,ret[1]=dog2;
* returnSize=2;
return ret;
}
Se explican los ejemplos clásicos de este capítulo, gracias por mirar ~~
Si crees que te es útil, ¡te puede gustar! !