Operación de bits para realizar el principio de realización y gestión de autoridad

En el desarrollo real, un objeto de clase a menudo tiene varios permisos, y cada permiso tiene dos estados: Sí y No. Normalmente, cuántos campos hay para guardar el estado correspondiente. Si hay demasiados permisos, este método parece extremadamente engorroso. Recientemente, aprendí una forma de realizar la gestión de autoridad con un campo int, que es conveniente y rápida, el principio de realización es simple y la operación se simplifica enormemente. Me tomó una mañana entera estudiar y simplemente me di cuenta de la gestión de 8 permisos (De hecho, el campo int puede administrar 32 bits, y no hay una diferencia esencial con la administración de 8 bits), aquí hay un breve resumen del proceso de implementación y los principios internos

1. Conocimientos básicos para conocer el espacio que ocupan los tipos de datos básicos en JAJA:

Cuatro tipos de tipos de datos básicos de Java y ocho tipos: byte (1 byte), corto (2 bytes), int (4 bytes), largo (8 bytes), char (1 byte), booleano (1 byte), Float (4 bytes), doble (8 bytes), de los cuales 1 byte = 8 bits, por lo que el tipo int ocupa 32 bits en la memoria de la computadora

2. Conocimientos básicos para comprender los operadores de bits en JAVA, utilizados aquí & (y), | (o), ~ (no)

Operaciones simples (todos los datos binarios)

1 y 1 = 1 1 | 1 = 1 ~ 0 = 1

1 y 0 = 0 1 | 0 = 1 ~ 1 = 0

0 y 1 = 0 0 | 1 = 1

0 y 0 = 0 0 | 0 = 0

Después de comprender el conocimiento básico anterior, simplemente escriba una pequeña demostración y pruebe la conveniencia de usar la operación de bits para administrar los permisos (si los números decimales participan en las operaciones de bits, primero convierta el número decimal a binario y luego conviértalo a decimal después de que se complete la operación , Todo esto lo hace automáticamente la computadora)

 

public class Authority {     // Agregar permisos     private static final int ALLOW_INSERT = 1 << 0;     // Eliminar permisos     private static final int ALLOW_DELETE = 1 << 1;     // Modificar permisos     private static final int ALLOW_UPDATE = 1 << 2;     / / Ver permisos     private static final int ALLOW_SELECT = 1 << 3;     // Leer permisos     private static final int ALLOW_READ = 1 << 4;     // Permisos de     escritura private static final int ALLOW_WRITE = 1 << 5;     // Copiar privilegio     private static final int ALLOW_COPY = 1 << 6;     // Privilegio de solo lectura     private static final int ALLOW_READONLY = 1 << 7;     // Se usa para guardar los permisos existentes actualmente, es decir, use este campo para guardar 8 estados de permisos     private int state;


















    // Establecer permisos, uno o más
    public void setAuto (int auto) {         state = auto;     }     // Usar para agregar un permiso, uno o más     public void addAuto (int auto) {         state = state | auto;     }     // Usado para eliminar un permiso     public void delAuto (int auto) {         state = state & ~ auto;     }     // Se usa para verificar si hay un determinado permiso     public boolean isAllow (int auto) {         return ((state & auto) == auto) ;     }     // Se usa para verificar si no hay un permiso determinado     public boolean isNotAllow (int auto) {         return ((state & auto) == 0);     }

















}

mirada vacía estática pública (Autoridad automática) {         System.out.println ("ALLOW_INSERT 有 权限 :" + auto.isAllow (ALLOW_INSERT));         System.out.println ("ALLOW_DELETE 有 权限 :" + auto.isAllow (ALLOW_DELETE));         System.out.println ("ALLOW_UPDATE 有 权限 :" + auto.isAllow (ALLOW_UPDATE));         System.out.println ("ALLOW_SELECT 有 权限 :" + auto.isAllow (ALLOW_SELECT));         System.out.println ("ALLOW_READ 有 权限 :" + auto.isAllow (ALLOW_READ));         System.out.println ("ALLOW_WRITE 权限 :" + auto.isAllow (ALLOW_WRITE));         System.out.println ("ALLOW_COPY 权限 :" + auto.isAllow (ALLOW_COPY));         System.out.println ("ALLOW_READONLY 有 权限 :" + auto.isAllow (ALLOW_READONLY));








 

 

Lo anterior es todo el código de la demostración que usa el campo int para administrar los 8 estados de permisos. El estado de estos 8 permisos es lo que comienzo al azar, no me importan estos detalles

Escriba un método de prueba para verificar

public static void main (String [] args) {

    // Prueba 1: configura un objeto para que tenga 8 permisos

    Autoridad auto = nueva Autoridad ();

    auto.setAuto ((1 << 8) -1);

    mirar (auto);

    El resultado de la impresión muestra que todos los permisos son verdaderos

    // Prueba dos, sobre la base de todos los permisos, elimina la adición, eliminación, modificación y verifica los permisos

    auto.delAuto (ALLOW_INSERT | ALLOW_DELETE | ALLOW_UPDATE | ALLOW_SELECT);

     mirar (auto); 

    El resultado de la impresión muestra que el permiso para agregar, eliminar, modificar y verificar es falso

    // Prueba 3 Agrega el permiso de eliminación en base a la Prueba 2

   auto.addAuto (ALLOW_DELETE);

   mirar (auto); 

   El resultado de la impresión muestra que el permiso de eliminación se ha agregado correctamente.

   Hasta ahora, la demostración de la función básica está completa. Un campo int puede guardar varios estados. Aquí hay una breve explicación del principio interno

   1. Primero defina 8 estados, cada estado se obtiene desplazando el número de bits hacia la izquierda en el sistema binario, es decir

      0000 0000 0000 0000 0000 0000 0000 0001 significa 1 << 0;

     Dado que aquí se muestran 8 estados, solo se escriben 8 bits y se omiten todos los ceros anteriores.

     0000 0001 1 << 0 ALLOW_INSERT

     0000 0010 1 << 1 ALLOW_DELETE

     0000 0100 1 << 2 ALLOW_UPDATE

     0000 1000 1 << 3 ALLOW_SELECT

     0001 0000 1 << 4 ALLOW_READ

     0010 0000 1 << 5 ALLOW_WRITE

     0100 0000 1 << 6 ALLOW_COPY

     1000 0000 1 << 7 ALLOW_READONLY

No es difícil ver de lo anterior que, entre estos 8 bits, 1 representa autoridad y 0 no representa autoridad. De esta manera, cada bit controla una autoridad por separado, y la combinación de 8 bits puede realizar la gestión de 8 tipos de autoridad.

1. Establecer permisos setAuto (int auto) {

                       estado = auto;

                      }

La implementación es tal que se pasa un valor int, y un valor representa un permiso, y se puede pasar más de uno. Utilice el operador de bits "|" para conectar parámetros, como agregar y eliminar permisos

                    Aumente los permisos ALLOW_INSERT su forma binaria 0000 0001

                    Eliminar permiso ALLOW_DELETE su forma binaria 0000 0010

                                    De acuerdo con el principio de operación de bits, dos números binarios se colocan en OR

                                                 0000 0001

                                         | 0000 0010

                                                 0000 0011        

                                     No es difícil ver que los dos últimos permisos de adiciones y eliminaciones son ambos 1, lo que significa que actualmente hay permisos de adiciones y eliminaciones, y el resto de los permisos son todos 0, lo que significa que no hay permisos.

2. Eliminar el permiso public void delAuto (int auto) {                            state = state & ~ auto;                         }      

                        Explicación del código: establezca el estado del estado en la negación del estado actual y el valor int cargado. Por ejemplo, actualmente existe el permiso para agregar y eliminar, y el permiso debe eliminarse.

                        Según el principio de operación de bits 0000 0011 & ~ 0000 0001         

                         El primer paso ~ 0000 0001 es 1111 1110

                         La segunda parte 0000 0011 y 1111 1110

                          0000 0011

                  & 1111 1110 

                          0000 0010

                     El resultado es 0000 0010. Se puede ver que el número en el bit de permiso agregado es 0, lo que significa que no hay ningún permiso agregado, solo el permiso de eliminación.

3. Comprueba si tienes permiso

                    public boolean isAllow (int auto) {                         return ((estado y auto) == auto);                     }

        Suponga que actualmente tiene permiso para agregar y eliminar 0000 0011

        Pase el valor int ALLOW_INSERT y su binario es 0000 0001, lo que significa ver si hay un aumento en los permisos

        El valor de (0000 0011 y 0000 0001) es 0000 0001

         Como se mencionó anteriormente, si se trata de una operación de bits, la computadora convertirá el número a un cálculo binario y luego convertirá el resultado a decimal

         == es un operador lógico y debe convertirse a cálculo decimal

         El sistema decimal de 0000 0001 es 1, y el parámetro pasado 0000 0001 también es 1, y el resultado de 1 == 1 es verdadero 

        Es decir, 0000 0011 ha aumentado la autoridad, y esta operación de bit también calcula otros métodos, no demostrados uno por uno.

              

      

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/csdnbeyoung/article/details/88389233
Recomendado
Clasificación