Tabla de contenido
Los operadores de desplazamiento son necesarios cuando se quiere manipular los bits de una manera más dinámica, están representados por los siguientes símbolos:
<<
>>
👁️ Ejemplo:
// Bit shift right
0b0001**110** >> 3 = 0b**000**0001 /* (tres zeros fueron agregados a la izquierda y los
bits de la derecha fueron sacados del numero */
// Bit shift left
0b**00**001110 << 2 = 0b001110**00** // dos nuevos bits fueron agregados a la derecha
//The bit-shift roll
//76543210 bits
1 = 0b00000001 = 0x01
(1 << 0) = 0b00000001
(1 << 1) = 0b00000010
(1 << 5) = 0b00100000
(1 << 7) = 0b10000000
/*
* Ej0.c
*
* Created: 06/02/2024 08:38:57 a. m.
* Author : Jesus Camarena
*/
#include <avr/io.h>
int main(void) //setup
{ //76543210
DDRB = (1<<5); //bit 5 es una salida
PORTB = (1<<PORTB5); //bit 5 (PORTB5) esta encendido
//0b00100000
while (1) //loop
{
}
}
Las compuertas lógicas más comunes se encuentran disponibles en el lenguaje C y estas hacen su función lógica bit a bit
~
(alt + 126) el operador NOT bitwise se encarga de negar todo los bits del registro o dato//Not bitwise
dato = 0b1001;
dato = ~0b1001;
RES = 0b0110;
|
(alt + 124) el operador OR bitwise se encarga de hacer una comparación de bits, si el dato o la or tiene un “1” regresa un “1” como resultado, regresa un “0” como resultado cuando todos son 0//OR Bitwise
dato = 0b10010101
| 0b11110000;
dato = 0b11110101;
AND &
(alt + 38) el operador AND bitwise se encarga de hacer una comparación de bits, si el dato o la or tiene un “1” regresa un “1” como resultado, regresa un “0” como resultado cuando todos son 0
XOR ^
(alt + 94) el operador EXOR bitwise se encarga de regresar un “1” si es que uno de los dos bits son 1
//AND Bitwise
dato = 0b10010101
& 0b11110000;
dato = 0b10010000;
//XOR Bitwise
dato = 0b10010101
^ 0b11110000;
dato = 0b01100101;
Las mascaras de bit son necesarias en el momento que se quiere manipular un solo bit de todo el registro al usar PORTD = (1 << PORTD0);
estas encendiendo solo el bit 0 y apagando todos los demás, para evitar esto se utilizan las siguientes operadores lógicos bit a bit (bitwise)
Máscara con compuerta OR “S1” siempre es “1” sin importar el valor de “A”
Mascara con compuerta OR “S2” depende el valor de la entrada “B”
Máscara con compuerta AND “S4” siempre es “0” sin importar el valor de “D”
Mascara con compuerta AND “S3” depende el valor de la entrada “C”
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|
PORTX | X | X | X | X | X | X | X | X |
OR | 1 | 1 | 1 | 1 | 0 | 0 | 0 | |
Resultado | 1 | 1 | 1 | 1 | X | X | X | X |
PORTX = XXXXXXXX -> PORTX = PORTX | 0b11110000;
→ PORTX = 1111XXXX
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|
PORTX | X | X | X | X | X | X | X | X |
AND & | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
Resultado | X | X | X | X | 0 | 0 | 0 | 0 |
PORTX = XXXXXXX -> PORTX = PORTX & 0b11110000;
→ PORTX = XXXX0000
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
PORTX = PORTX ^ 0b11110000;
→ PORTX = 00110011