Operación de bits | (bit a bit o) & (bit a bit y) ^ (bit a bit exclusivo o)

Tabla de contenido

Catálogo de artículos: este capítulo explica principalmente la serie de preguntas sobre el cepillado.

        1: Primero, se presentarán las funciones y propiedades de los tres operadores I y ^.

        2: Tres preguntas clásicas de prueba escrita que utilizan operadores bit a bit (de la oferta de Jianzhi)

                        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

               3: La espada se refiere a la Oferta 56 - I. La cantidad de veces que aparece el número en la matriz - 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! !

        

Supongo que te gusta

Origin blog.csdn.net/2201_75964502/article/details/132714292
Recomendado
Clasificación