Operaciones con Bits y Binario

prefacio

Principalmente registra algunas operaciones usando binario, lo cual es conveniente para la resolución eficiente de problemas.

Operaciones básicas y reglas.

Primero hablemos sobre las reglas básicas de operación de esta operación de bits y las reglas básicas que se pueden usar para resolver problemas.

y operación

1&1=1

1&0=0

0&0=0

^ operación

1^1=0

1^0=1

0^0=0

| operación

1|1=1

1|0=0

0|0=0

operación de cambio a la izquierda y a la derecha

a<<1: a se desplaza uno a la izquierda

a>>1: a se desplaza a la derecha en uno

Leyes básicas

1. Cuando una computadora realiza operaciones, esencialmente realiza operaciones binarias, lo que significa que podemos hacer un uso completo de esta propiedad para lograr resultados inesperados.

2. La suma de K números en K base sin acarreo es 0

3. Un bit binario es XORed con 1 para guardar el estado actual

4. La resta de números binarios convertirá el 1 más bajo en 0

Si esto se combina con nuestra Ley 1, ocurrirán muchas operaciones muy interesantes.
Luego presentaré algunos usos en orden.

caso

^ Trucos de computación

Proporcione un requisito, por ejemplo, una matriz [1,1,2,2,3,3,4,5,5]

Excepto cierto número, todos los demás números aparecen en pares, y ahora te permiten encontrar el número que no aparece en pares, como el 4 en el ejemplo.

Esquema 1 método hash

En primer lugar, es fácil pensar en el método hash, pero en este caso, la complejidad del espacio obviamente no es buena, y es necesario atravesar la matriz hash una vez para saber la respuesta.

public class 位运算1 {
    
    

    public static void main(String[] args) {
    
    

        int[] a = new int[]{
    
    1,1,2,2,3,3,4,5,5};

        int[] hash = new int[a.length];

        for (int j : a) {
    
    
            hash[j]++;
        }

        for (int i = 0; i < hash.length; i++) {
    
    
            if(hash[i]==1){
    
    
                System.out.println(i);
            }
        }

    }

}

Escenario 2 ^ Operación

El tiempo y el espacio de la solución no son buenos, por lo que si desea resolver esta solución, debe usar la operación ^.

Desde: 1^1=0 0^0=0

Entonces, cuando 3 y 3 tienen XOR, el resultado debe ser 0, por lo que los XOR emparejados son todos 0, luego 0 y 4 XOR son naturalmente 4

public class 位运算1 {
    
    

    public static void main(String[] args) {
    
    
        //找出不同
        int[] a = new int[]{
    
    1,1,2,2,3,3,4,5,5};

          int x = 0;
          for (int i : a) {
    
    
              x = x^i;
          }
          System.out.println(x);
    }

}

Cuente el número de bits que son 1

Dado un número decimal, te pedirá que veas cuántos 1 hay en los dígitos del número decimal

Por ejemplo, 3–>011
tiene dos aquí

Como hay muchas soluciones aquí, hablaré de ellas juntas aquí.

La forma más fácil de lidiar con

De manera similar, es fácil pensar en convertir directamente este decimal a binario y luego contar 1.

public class 运算二 {
    
    
    public static void main(String[] args) {
    
    
        int a = 3;
        char[] chars = Integer.toString(a, 2).toCharArray();
        int count = 0;
        for (char aChar : chars) {
    
    
            if(aChar=='1'){
    
    
                count++;
            }
        }
        System.out.println(count);
    }
}

Esta es una de las opciones más fáciles de pensar. Así que aquí, puedes usar operaciones de bits para hacerlo rápidamente.

utilizar la operación de cambio

imagen.png

La forma de pensar es así, y es fácil de escribir.

public class 运算二 {
    
    
    public static void main(String[] args) {
    
    
        int a = 3;
        int count = 0;
        for (int i = 0;i<32;i++){
    
    
            //4个字节32位
            if((a&(1<<i)) == (1<<i)){
    
    
                count++;
            }
        }
        System.out.println(count);
    }
}

Por supuesto, aquí se usa el desplazamiento a la izquierda, y está bien que desplacemos a la derecha.

Resta 1 usos mágicos

Recuerda el punto 3 que escribí antes.
si un número como a=3

imagen.png

public class 运算二 {
    
    
    public static void main(String[] args) {
    
    
        int a = 3;
        int count = 0;
        while (a!=0){
    
    
            a = a&(a-1);
            count++;
        }
        System.out.println(count);
    }
}

| Transición de estado de operación

¿Recuerdas este, nuestro tema anterior?

Compresión de estado + programación dinámica (Blue Bridge Cup 2019 java group A candy problem)

Tiene algo muy inteligente, que es convertir el siguiente grupo primitivo único en un número de estado, lo cual es conveniente para dp

6 5 3  
1 1 2  
1 2 3  
1 1 3  
2 3 5  
5 4 2  
5 1 2  
6 5 3    状态压缩
		二进制  十进制
1 1 2   00011	3
1 2 3	00111	7
1 1 3	00101	5

Nuestro código funciona así

w[i] |=(1<<k-1) ;

Esta w es para salvar nuestro estado.
En ese momento, el significado de dp es cuántos dulces se necesitan en el estado actual.

Aquí hay un poco sobre la construcción de la matriz dp, solo necesita recordar que el valor de este dp siempre se guardará, la solución óptima actual, como este problema de dulces, requiere la cantidad mínima de paquetes, primero vea el palabras más pequeñas y más grandes, debe ser Es dp o codicioso, pero todos los que entienden la codicia entienden, consideren directamente dp (nada más que 0-1 problema de mochila o múltiples mochilas, etc.) para requerir esta cantidad de paquetes, entonces debe ser dp[i] = valor El valor debe ser el número de paquetes, entonces Qué es esta i, entonces debe ser una variable que determina o afecta el valor. Entonces, si no sabemos cómo guardar el estado aquí, entonces es muy probable que el dp que finalmente construyamos sea así dp[][][]...=value El número de [] depende de cuántos dulces tener.

Entonces, cómo se transforma esto, no lo aclaré antes, así que lo diré nuevamente aquí.
De hecho, es muy simple, lo que queremos hacer al final es
la forma binaria del formato 0 0 0 0 0 (por supuesto, se convertirá a decimal para la computadora al final, para que usemos directamente un número para representar un estado)

Primero vemos el conjunto de datos
1 1 2

0 0 0 0 0 estado inicial
Después de eso, tomamos la E, desplazamos 1-1 bits a la izquierda y luego hacemos
la operación OR, por lo que obtenemos
0 0 0 0 1

Otro 1
o
0 0 0 0 1
es seguido por 2 Desplazamiento a la izquierda 2-1 unidades y luego operación bit a bit

0 0 0 1 1

Así que 3 representa el estado de 1 1 2.

Así que las operaciones con bits siguen siendo muy inteligentes.
Si quiero jugar la Copa Blue Bridge, creo que todavía es muy probable que juegue este tipo de compresión de estado. El estado se comprime y luego se pone en una mochila.

Con respecto al problema de la mochila también estoy en proceso de resumir, porque hay muchos problemas, el primero es el problema de búsqueda, básicamente nosotros directamente DFS, BFS no pensamos en nada más, a lo sumo pensamos en dos puntos. si es un problema de dp cual es el problema mas valioso basicamente dp y luego hay variantes de estos problemas de dp que son basicamente el problema de la mochila lo mas que he visto hasta ahora no es mas que una mochila completa un 0 -1 mochila, y luego lo configuramos de nuevo Modelo, y luego optimizamos el espacio, básicamente eso es todo. ¿Qué tal el resto? Depende de la situación real. Por supuesto, todavía hay algunos problemas matemáticos. Después de todo, el Azul Bridge Cup es una competencia de algoritmos. Todavía habrá algunos problemas matemáticos. Debes dominar algunas matemáticas. Teoría, pero básicamente me rendiré cuando la vea, a menos que pueda ser violenta y exhaustiva (es decir, retroceder) (así que domina los tres puntos principales, retroceso recursivo, búsqueda (DFS, BFS, bisección), dp (ocho problemas de mochila) y luego Cepillar hasta la muerte, por supuesto, esta es solo mi idea actual. Si hay un gran jefe, por favor dé algunos consejos (área de comentarios)
Para ser honesto, no soy un concursante profesional.

Supongo que te gusta

Origin blog.csdn.net/FUTEROX/article/details/123482918
Recomendado
Clasificación