¿Qué son las operaciones de bits?

Bit, ¿qué está pasando? podrías preguntar.

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

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

& 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;