Anda di halaman 1dari 5

Lenguaje C parte 4

Cátedra de Computación

Operadores de bit:

Introducción:

Al contrario de la mayoría de los otros lenguajes, C soporta un complejo juego de operadores a nivel de bit. Dado que el lenguaje C, fue diseñado para sustituir al lenguaje ensamblador en muchas tareas de programación, era importante permitir todas las operaciones que se puedan hacer en ensamblador. Cuando digo operaciones a nivel de bit, me refiero a la comprobación, asignación o desplazamiento de los bit reales que componen un byte o una palabra, que corresponden a los tipos estándar de C, char, int con sus variantes. Las operaciones a nivel de bits no se pueden usar sobre float, double, long double, void u otro tipo más complejo.

Lista de operadores:

Los AND, OR y el complemento a uno NOT se rigen por la misma tabla de verdad que gobierna sus equivalentes lógicos, excepto que funcionan a nivel de bit a bit.

Operador

Acción

&

|

^

~

>>

<<

Y O

Y O

O exclusiva (XOR)

Complemento a uno Desplazamiento a la derecha Desplazamiento a la izquierda

Complemento a uno Desplazamiento a la derecha Desplazamiento a la izquierda
Complemento a uno Desplazamiento a la derecha Desplazamiento a la izquierda

Operación AND:

Operadores sobre bit

Dado que p y q son variables booleanas, el AND tiene la siguiente tabla de verdad.

P

q

P & q

0

0

0

1

0

0

0

1

0

1

1

1

La salida de un AND es verdad sólo si exactamente los dos operando son verdad; es falso si existe cualquier otra condición, se puede pensar en el AND sobre bit como una manera de poner los bits inactivos; es decir, cualquier bit que es 0 en cualquier operando provocara la salida 0 (FALSE). Entonces cuando se quiere comprobar si un bit esta en cero o uno (TRUE o FALSE), ya sabemos que operador usar.

Las operaciones sobre bit más frecuentes encuentran aplicación en controladores de dispositivos (driver), programas de módem, rutinas de archivo de

Lenguaje C parte 4

Cátedra de Computación

disco , programas de compresión y descompresión, manipulación de imagen y sonido, etc.

Ahora veremos una operación AND sobre una variable char es decir 8 bit, lo que se propone es poner el bit de paridad en 0. (Se usa el bit de paridad para confirmar que el resto de bits en el byte está sin cambio. Usualmente la indica el octavo bit).

 

1

1

0

0

0

0

0

1

Ch que contiene una < A > con paridad

0

1

1

1

1

1

1

1

127 en binario (mascara)

&

----

----

----

----

----

----

----

----

AND sobre los bits

0

1

0

0

0

0

0

1

< A > sin paridad

Implementando un AND en C.

¸ La siguiente sentencia comprueba si existe un 1 o 0 en el bit 4 de la variable bufer.

int comprobar_bit(char bufer)

{

if ( bufer & 8) return 1; return 0;

}

Compara bufer con el valor 8 ya que, en binario, 8 se representa como 00001000. La sentencia if sólo puede cumplirse cuando el bit 4 de bufer está activo, en programación se dise que se enmascara la variable con un 8.

¸ Otro ejemplo es el siguiente fragmento de código (función) que lee primero un char del puerto de módem (RS232) usando la función de biblioteca bioscom() y después pone el bit de paridad a cero.

char LeeCharModem( char )

{

char bufer; bufer = bioscom( 1 , 0 , 0 ); bufer = ( bufer & 128 ); return ( bufer );

}

v Una herramienta importante para visualizar resultados en formato binario es la función.

void PrintBinario(char temp)

{

register unsigned char i; for ( i = 128 ; i > 0 ; i = i / 2) if ( temp & i ) printf( ''1'' ); else printf( ''0'' );

}

Operación OR:

Lenguaje C parte 4

Cátedra de Computación

Se puede usar el OR sobre bit como el inverso de AND, OR pondrá los bit activos, p y q variables booleanas, el OR tiene la siguiente tabla de verdad.

P

Q

P

& q

0

0

 

0

1

0

1

0

1

1

1

1

1

La operación OR compara dos bits y genera TRUE como resultado si uno de los dos o ambos bit son uno. Una OR es útil para fijar en uno posiciones específicas de los bits.

 

0

1

0

0

0

0

0

1

Ch que contiene una < A > sin paridad 128 en binario (mascara) OR sobre los bits < A > con paridad

1

0

0

0

0

0

0

0

|

----

----

----

----

----

----

----

----

1

1

0

0

0

0

0

1

Implementando un OR en C.

 

Se puede aplicar a los mismos ejemplos de la AND y los resultados serán los inversos.

Operación OR exclusiva (XOR) :

 

Un OR exclusivo, que usualmente se abrevia como XOR, pondrá activo un bit si y solo si los bits que se comparan son complementarios (diferentes). el XOR tiene la siguiente tabla de verdad.

 

P

 

Q

 

P

& q

0

 

0

 

0

1

0

1

0

1

1

1

1

0

Esta operación lógica es muy útil cuando necesitamos complementar posiciones de bit específicos, o aleatorios como ocurre en aplicaciones gráficas. Ya que hablamos de gráficos, si se desea lograr un efecto visual sobre alguna área de memoria siempre se trata de hacer uso de compuertas es la única manera de operar a alta velocidad.

 

Vemos una operación XOR sobre una variable char es decir 8 bit.

0

0

0

0

0

0

0

1

Ch que contiene un < F > en HEXA

< 1 > en HEXA

0

0

0

0

1

1

1

1

^

 

----

----

----

----

----

----

----

----

0

0

0

0

1

1

1

0

XOR sobre los bits < E > en HEXA

Cabe aclarar que solo estamos usando los cuatro bits menos significativos del byte (resolución 4bit), esto es el nible LSB, el nible más significativo lo vamos a despreciar. Observando el resultado anterior es una #Eh, era de esperar, pero si

Lenguaje C parte 4

Cátedra de Computación

reiteramos la operación mascara XOR resultado, es decir #1h ^ #Eh = #Fh o sorpresa recuperamos el valor anterior veámoslo bien.

 

0

0

0

0

0

0

0

1

Ch que contiene un

< 1 > en HEXA

0

0

0

0

1

1

1

0

< E > en HEXA

^

XOR sobre los bits

 
 

----

----

----

----

----

----

----

----

0

0

0

0

1

1

1

1

< F > en HEXA

Todo muy lindo pero, ¿En qué parte de los gráficos se aplica todo esto?, bien es sencillo si quieres programar la inversión de colores de una determinada zona de la pantalla o toda la pantalla, solo tienes que aplicar una mascara con una compuerta XOR sobre la misma, y cuando quieras restaurar la imagen original vuelves a aplicar la misma mascara con la XOR a la misma área y ya esta, sin mas complicaciones y a muy alta velocidad. (Variando el número “color” de la mascara se obtendrán distintos efectos). Se logran efectos mas complejos si se aumenta la resolución en ves de char usar un int es decir 16bit, también abra que aplicar las compuertas por medio de algún algoritmo.

Implementando un XOR en C.

Las aplicaciones gráficas en lenguaje C son un tanto complejas por lo tanto no expondré ningún ejemplo ya que se saldría del tema, si tiene interés en ver un ejemplo remítase al index del help de TC++ ver 3.0, escriba putimage y vera setimage example este es un ejemplo interesante que usa una compuerta XOR.

Desplazamiento a la derecha >> :

La forma general de la sentencia de desplazamiento a la derecha es

Variable >> números de posiciones en bit;

Con esta sentencia se desplazan los bits de una variable hacia la derecha y la computadora completa con ceros el otro extremo, los bits que desaparecen por la derecha no se podrán recuperar. La siguiente función escrita en C desplaza dos bits a la derecha en una variable int (16bit).

int desplaza_derecha(int bufer)

{

return (bufer >> 2);

}

Si la entrada es 96 por ejemplo esto en binario es 01100000, la función retornara 24 que igual a 00011000. Se puede usar la sentencia de desplazamiento a la derecha para efectuar divisiones rápidas de enteros, desplazar un bit a la derecha es efectivamente dividir por dos, comprobar con la función de arriba cambiar el desplazamiento a uno.

Desplazamiento a la izquierda << :

Lenguaje C parte 4

Cátedra de Computación

La forma general de la sentencia de desplazamiento a la izquierda es:

Variable << números de posiciones en bit;

Con esta sentencia se desplazan los bits de una variable hacia la izquierda y la computadora completara con ceros el otro extremo, los bits que desaparecen por la izquierda no se podrán recuperar. La siguiente función escrita en C desplaza un bit a la izquierda en una variable int (16bit).

int desplaza_izquierda(int bufer)

{

return (bufer << 1);

}

Por ejemplo entrada es

=

7

=

00000111

Se efectúa el desplazamiento

 

Salida es =

14 =

00001110

Se puede usar el desplazamiento a la izquierda para efectuar multiplicaciones rápidas de enteros, desplazar un bit a la izquierda será equivalente a multiplicar por dos, comprobar con la función anterior.

Recordar que un desplazamiento no es una rotación los bits desplazados por un extremo no vuelven al otro. Por eso decía que estos bits se pierden, y los ceros que aparecen los reemplazan. Los desplazamientos tanto de derecha como de izquierda también son muy útiles cuando se decodifican entradas de dispositivos externos como convertidores D/A y cuando se lee información de estado. C no contiene operador rotación, pero se puede crear fácilmente una función para realizar esta tarea. Una operación de rotación es similar a una operación de desplazamiento a la izquierda excepto que una operación de rotación desplaza los bits que salieron por la izquierda a la derecha. Por ejemplo, 1010 rotado una vez es 0101. No propondré ninguna función de ejemplo ya que será necesario el uso de una unión para que el programa sea legible, rápido y reducido una unión es un tipo de dato en el lenguaje C que no se vera en este momento.