¿Qué son las operaciones de bits?
En pocas palabras, los bits son unos y ceros, y todo lo que se hace en la computadora se compone de ellos. Todos los datos en una computadora están representados por bits. Un byte consta de 8 bits; una palabra consta de dos bytes o 16 bits; una palabra doble consta de cuatro bytes o 32 bits.
0 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0
||.. ............|.............|.............|..... .... .....||
|+-bit 31......|.............|.. ...... .|......Bit 0 -+|
|.............|.. ............. |............|.............|
+ -Byte 3 - + -Byte 2 - + -Byte 1 - + -Byte 0 - +
|............ ............|.......... ..................|
+ - PALABRA 1 - + - PALABRA 0 - +
|..... ................... ................................. ..|
+ - DWORD - +
Las operaciones bit a bit que utilizan bytes, palabras o palabras dobles son tan hermosas como usar una pequeña matriz o estructura. Usando operaciones de bits, puede verificar o establecer el valor de un solo bit o de un grupo de bits.
La relación entre números hexadecimales y bits
Me resulta difícil expresar la comparación de números usando el conteo binario. Para evitar este problema, se utiliza notación hexadecimal (base 16). Un número en hexadecimal está representado por cuatro dígitos en binario, del 0 al 15. Un grupo de cuatro bits, un mordisco. Si un byte tiene dos cuartetos, entonces el valor de un byte se puede representar mediante dos dígitos hexadecimales.
Número hexadecimal de Nibble
====== =========
0000..... ...0
0001.....1
0010.....2
0011.... ....3
0100.....cuatro
0101.....5
0110... .....6
0111... ..siete
1000.....8
1001.. ......9
1010.....A p>
1011.....B
1100 .......C
1101.....D
1110.....E
1111 .......F
Si hay un byte con la letra 'r' (código ASCII 114), su significado es de la siguiente manera:
0111 0010 número binario
p>7 2 número hexadecimal
Nota: 0x72
Operador posicional
* * *Hay operadores de seis bits, como se muestra a continuación:
& operador de producto lógico amp
u operador
Operador XOR
~Operador de negación
& gt& gtOperador de cambio a la derecha
& lt& ltOperador de cambio a la izquierda
& operador de amplificador
& ampAND operación Toma dos operandos y devuelve un valor. El valor de retorno es 1 si y sólo si ambos operandos son 1.
Tabla a continuación:
1 1 == 1
1 0 == 0
0 & amp1 == 0
0. & amp0 == 0
Un byte puede contener un indicador de bit y la operación AND puede verificar el valor del bit estableciendo una máscara. El algoritmo es el siguiente: se utiliza para determinar si el cuarto bit del byte es 1.
Byte b = 50
if (b & amp0x10)
cout & lt& lt"El cuarto bit está establecido"& lt& ltendl
Otro
cout & lt& lt"El cuarto bit está claro"& lt& ltendl
El resultado se puede obtener mediante el siguiente cálculo:
.. .00110010 - b
&00010000-&0x10
-
....00010000 -result
Entonces el cuarto bit. es 1.
|Operador
| El operador (o) toma dos operandos y devuelve un valor. El valor de retorno es 1 si y sólo si uno o ambos operandos son 1. La siguiente tabla:
1 | 1 == 1
1 0 == 1
0 | 0 | 0 == 0
El uso de la operación OR puede garantizar que un bit en el byte sea 1. El algoritmo es el siguiente: se utiliza para garantizar que el segundo bit sea siempre 1.
Byte b = 50
Byte c = b | 0x04
cout & lt& lt" c = " & lt& ltc & lt& ltendl
El resultado se puede obtener mediante el siguiente cálculo:
....00110010 - b
| 00000100 - 0x04
-
....00110110-Resultado
Operador XOR
El operador XOR toma dos operandos y luego devuelve un valor. El valor de retorno es 1 si y sólo si uno de los dos operandos es 1 y no 1. La siguiente tabla:
1 ^ 1 == 0
1 ^ 0 == 1
0 ^ 1 == 1
0 ^ 0 == 0
Puedes usar XOR para invertir bits específicos. Es decir, 0 se convierte en 1 y 1 se convierte en 0. El algoritmo es el siguiente: invertir el tercer y cuarto bit
byte b = 50
cout & lt& lt" b = " & lt& ltb & lt& ltendl
b = b ^ 0x 18;
cout & lt& lt" b = " & lt& ltb & lt& ltendl
b = b ^ 0x
cout & lt& lt" b = " & lt& ltb & lt& ltendl
El resultado se puede obtener mediante el siguiente cálculo:
....00110010 - b
^ 00011000 -^ 0x 18
-
....00101010 -resultado
00101010 - b
^ 00011000- ^ 0x 18
-
....00110010 -Resultado
~Operador de negación
~El operador (Negación) solo requiere uno Operandos, entonces todos los 1 se convierten en 0 y todos los 0 se convierten en 1. Usando la operación de inversión, algunos bytes se pueden establecer en 0, asegurando que otros bytes se establezcan en 1 y dejarlo como está.
El tamaño de los datos. El algoritmo es el siguiente: 1 para todas las posiciones, 0 para la primera y 0ª posición.
Byte b = ~ 0x03
cout & lt& lt" b = " & lt& ltb & lt& ltendl
Palabra w = ~ 0x03
cout & lt& lt" w = " & lt& ltw & lt& ltendl
El resultado se puede obtener mediante el siguiente cálculo:
00000011 - 0x03
11111100- ~ 0x 03 b
0000000000000011-0x 03
1111111111111111100-~ 0x 03 w
Utilizado con el operador (Con), se puede establecer cualquier posición a 0. El algoritmo es el siguiente: establece la cuarta posición 0
byte b = 50
cout & lt& lt" b = " & lt& ltb & lt& ltendl
palabra Sección c = b & amp~ 0x 10;
cout & lt& lt" c = " & lt& ltc & lt& ltendl
El resultado se puede obtener mediante el siguiente cálculo:
....00110010 - b
& amp11101111-~ 0x 10
-
....00100010 -resultado p>
& gt& gt y
& gt& gt (desplazamiento a la derecha) operador y
byte b = 12;
cout & lt& lt" b = " & lt& ltb & lt& ltendl
byte c = b & lt& lt2;
cout & lt& lt" c = " & lt& ltc & lt& ltendl
c = b & gt& gt2;
cout & lt& lt" c = " & lt& ltc & lt& ltendl
El resultado se puede obtener mediante el siguiente cálculo:
00001100 - b
00110000-b & lt;& lt2
00000011-b & gt;& gt2
segmento de bits
< El segmento p>bit es la parte interesante de la manipulación de bits. Usando un campo de bits, puede establecer una pequeña estructura en un byte, palabra o palabra doble. Por ejemplo, para registrar fechas y requerir la menor cantidad de memoria posible, puede utilizar la siguiente instrucción de estructura:struct date_struct {
byte día: 5, // 1 a 31
Mes: 4, // 1 a 12
Año: 14; // 0 a 9999
} Fecha
Hasta en; En este ejemplo, el día ocupa los 5 dígitos más bajos, el mes ocupa los 4 dígitos siguientes y el año ocupa los 14 dígitos siguientes. La fecha completa se almacena en 23 bits de tres bytes. Se ignora el número 24. Si se utiliza una declaración de plástico, ocupará 12 bytes.
|0 0 0 0 0 0 0|0 0 0 0 0 0 0|0 0 0 0 0 0 0|
|
+ -Año- +Mes+ -Día- +
Como se mencionó anteriormente, el tipo de fecha utiliza la estructura de segmento. Aquí se utiliza BYTE. Un byte son 8 bits. Cuando se utiliza, el compilador asigna un byte para almacenarlo. Si la estructura supera los 8 bits, el compilador asignará otro byte hasta que sea suficiente para almacenar la estructura. Si se utiliza una palabra o palabra doble, el compilador aplicará un total de 32 bits para almacenar la estructura.
¿Cómo declarar una sección? Primero declare la variable de segmento, seguida de dos puntos, luego el número de dígitos asignados a la variable; separe cada segmento con una coma y finalmente use un punto y coma para indicar el final de la declaración.
Después de completar la declaración de la estructura, puede usar la estructura cómodamente a través de etiquetas de acceso, o puede usar el operador de dirección para operar la estructura.
Como se muestra a continuación:
fecha día = 12
dateptr = & fecha
dateptr - & gt;