Está en la página 1de 14

Operadores a nivel de bit

Fundamentos de programación de Sistemas Embebidos


Operadores a nivel de bit

Mg. Ing. E. Sergio Burgos

Universidad Nacional de Entre Rı́os


Facultad de Ingenierı́a
Especialización en Sistemas Embebidos

14/09/2018

1/9 Operadores a nivel de bit


Operadores a nivel de bit

Operadores a nivel de bit


La mı́nima unidad de memoria direccionable en la mayorı́a de los sistemas embebidos es el byte
(unsigned char o uint 8t). Más allá de esto es de suma utilidad realizar operaciones sobre los
bits que componen la información.
Para esto el Lenguaje C cuenta con un conjunto de operadores que permiten la realización de
diferentes operaciones.

2/9 Operadores a nivel de bit


Operadores a nivel de bit

Operadores a nivel de bit


La mı́nima unidad de memoria direccionable en la mayorı́a de los sistemas embebidos es el byte
(unsigned char o uint 8t). Más allá de esto es de suma utilidad realizar operaciones sobre los
bits que componen la información.
Para esto el Lenguaje C cuenta con un conjunto de operadores que permiten la realización de
diferentes operaciones.
Los operadores disponibles en lenguaje C son:

2/9 Operadores a nivel de bit


Operadores a nivel de bit

Operadores a nivel de bit


La mı́nima unidad de memoria direccionable en la mayorı́a de los sistemas embebidos es el byte
(unsigned char o uint 8t). Más allá de esto es de suma utilidad realizar operaciones sobre los
bits que componen la información.
Para esto el Lenguaje C cuenta con un conjunto de operadores que permiten la realización de
diferentes operaciones.
Los operadores disponibles en lenguaje C son:

2/9 Operadores a nivel de bit


Operadores a nivel de bit

Operadores a nivel de bit


La mı́nima unidad de memoria direccionable en la mayorı́a de los sistemas embebidos es el byte
(unsigned char o uint 8t). Más allá de esto es de suma utilidad realizar operaciones sobre los
bits que componen la información.
Para esto el Lenguaje C cuenta con un conjunto de operadores que permiten la realización de
diferentes operaciones.
Los operadores disponibles en lenguaje C son:

2/9 Operadores a nivel de bit


Operadores a nivel de bit

Operadores a nivel de bit


La mı́nima unidad de memoria direccionable en la mayorı́a de los sistemas embebidos es el byte
(unsigned char o uint 8t). Más allá de esto es de suma utilidad realizar operaciones sobre los
bits que componen la información.
Para esto el Lenguaje C cuenta con un conjunto de operadores que permiten la realización de
diferentes operaciones.
Los operadores disponibles en lenguaje C son:

2/9 Operadores a nivel de bit


Operadores a nivel de bit

Operadores a nivel de bit


La mı́nima unidad de memoria direccionable en la mayorı́a de los sistemas embebidos es el byte
(unsigned char o uint 8t). Más allá de esto es de suma utilidad realizar operaciones sobre los
bits que componen la información.
Para esto el Lenguaje C cuenta con un conjunto de operadores que permiten la realización de
diferentes operaciones.
Los operadores disponibles en lenguaje C son:

2/9 Operadores a nivel de bit


Operadores a nivel de bit

Operador complemento (~)


El operador de complemento invierte el contenido de todos los bits presentes en un dato generando
el complemento a 1.
Si bien desde un punto de vista ‘lógico’ su comportamiento puede resultar similar al operador not
(!), y en algunos casos funcionar de modo comparable, presenta diferencias. Consideremos algunos
casos:
uint8 t bandera; uint8 t bandera;
bandera = 0x00 bandera = 0x00;
bandera = !bandera; bandera = ∼bandera;
/* bandera ->1 */ /* bandera ->0xFF */

bandera = 0x0F; bandera = 0x0F;


bandera = !bandera; bandera = ∼bandera;
/* bandera ->0x00*/ /* bandera ->0xF0 */

El operador de complemento invierte todos los bits que forma parte del espacio de almacenamiento
de una variable, por lo que no tendremos necesariamente el mismo resultado al aplicarlo a dos
variables de diferentes tamaño.
uint8 t v1 = 0x00 uint32 t v2 = 0x00;
v1 = ∼v1; v2 = ∼v2;
/*v1 ->0xFF */ /* v2 ->0xFFFFFFFF */

3/9 Operadores a nivel de bit


Operadores a nivel de bit

Operador and (&)


El operador and representa la multiplicación a nivel binario. Si se aplica a dos bits, digamos A y B,
el resultado obtenido será el mostrado en la siguiente tabla:

A B A & B
0 0 0
1 0 0
0 1 0
1 1 1

Al aplicar esta operación a variables, el comportamiento anterior se propaga a cada uno de los bits
que la constituyen. Si A y B se definen como variables de tipo uint8 t obtendrı́amos:

A = 0x0F 0 0 0 0 1 1 1 1
B = 0x55 0 1 0 1 0 1 0 1
A & B = 0x05 0 0 0 0 0 1 0 1

El comportamiento visto en este ejemplo es el principio de uso más común de este operador: la
implementación de máscaras de lectura.

4/9 Operadores a nivel de bit


Operadores a nivel de bit

Operador and y máscaras


Consideremos el siguiente problema: disponemos de un sistema embebido que almacena en una
dirección de memoria un valor que representa el estado general del sistema.
Cada parte del valor representa un aspecto del sistema, a saber:

uint8 t estado b3 - b0: nivel de estado de baterı́a. Todos


los bits en 1 indican 100 %.
b7 b6 b5 b4 b3 b2 b1 b0
b4: estado de conectividad. Si este bit se
encuentra en uno el equipo cuenta con co-
nexión a internet.
b5: si está activo, indica que la fuente de
alimentación externa está conectada.
b7 y b6: no utilizados.

La solución a este problema consiste en utilizar valores que anulen los bits que no son de interés
para un fin particular. Por ejemplo:
uint8_t nivelBateria ;
uint8_t conectividad ;

nivelBateria = 0 x0F & estado ; /* 0 x0F = > 0000 1111 */


conectividad = 0 x16 & estado ; /* 0 x16 = > 0001 0000 */

5/9 Operadores a nivel de bit


Operadores a nivel de bit

Operador or (¦)
De modo análogo al operador and, el operador or está asociado a la suma (sin acarreo). Si se
aplica a dos bits, digamos A y B, el resultado obtenido será el de la siguiente tabla:

A B A ¦ B
0 0 0
1 0 1
0 1 1
1 1 1

Al aplicar esta operación a variables, el comportamiento anterior se propaga a cada uno de los bits
que la constituyen. Si A y B se definen como variables de tipo uint8 t obtendrı́amos:

A = 0x0F 0 0 0 0 1 1 1 1
B = 0x55 0 1 0 1 0 1 0 1
A ¦ B = 0x5F 0 1 0 1 1 1 1 1

Tal como en el caso del operador and (&) la forma de trabajo habitual consiste en la conformación
de máscaras (valores constantes) para establecer valores (‘1’) en posiciones particulares.

6/9 Operadores a nivel de bit


Operadores a nivel de bit

Operador xor (^)


El operador or exclusivo, no se corresponde necesariamente con una operación aritmética directa.
El resultado de su aplicación a dos bits, se muestra en la siguiente tabla.

A B A ^ B
0 0 0
1 0 1
0 1 1
1 1 0

De la tabla, suponiendo que B fuese una máscara (valor constante conocido) podrı́amos pensar que
controla el valor de A. Ası́, cuando B vale 0, la expresión A ^ B es igual al valor de A.
Cuando B toma valor 1, la expresión A ^ B es equivalente al valor de A negado.
Por esto lo podemos pensar como una ‘llave’ para controlar la inversión de un valor binario.
Del mismo modo que con los operadores anteriores, al aplicarse a una variable, el valor resultante
surge de la aplicación del operador a cada uno de los bits que lo constituyen.

A = 0x55 0 1 0 1 0 1 0 1
B = 0x0F 0 0 0 0 1 1 1 1
A ^ B = 0x5A 0 1 0 1 1 0 1 0

7/9 Operadores a nivel de bit


Operadores a nivel de bit

Operadores de Corrimiento
Los operadores de corrimiento permiten manipular el valor de los bits desplazándolos a la izquierda
y derecha, dando origen a nuevos valores. Cada vez que se realiza un desplazamiento, los valores
que ‘salen’ se pierden y se agregan bits con valor cero.
Ejemplos de uso:

# define BIT0 0 uint8_t val = 93; /* 0101 1101 */


# define BIT1 1 uint8_t r1 = 93 >> 2; /* 0001 0111 ( 23) */
# define BIT2 2 uint8_t r2 = 93 << 1; /* 1011 1010 (186) */

uint8_t msk = ( uint8_t )1 << BIT2 ;

Una de las aplicaciones más significativas es el uso de los operadores de corrimiento para realizar
multiplicaciones y divisiones por potencias de dos.

8/9 Operadores a nivel de bit


Operadores a nivel de bit

Fin Módulo 6

9/9 Operadores a nivel de bit

También podría gustarte