Vamos a programar #101 - Operaciones a nivel de bits en Python y tablas de verdad.

 Hola de nuevo a todos, el día de hoy vamos a ver mas operaciones a nivel de bits.


Hace algunos días alguien me pregunto que si era posible usar operaciones a nivel de bits en Python, la respuesta sencilla es: si. Pero ¿Cómo es que trabaja cada una y cuales son las que están disponibles? Anteriormente vimos cómo es posible usarlos en C# y si bien son esencialmente lo mismo, vale la pena revisarlas por separado. En este post veremos las operaciones disponibles SOLO para Python.


En Python disponemos de las siguientes operaciones:

  • Or (o) "|"
  • XOr (o exclusivo) "^"
  • And (y) "&"
  • Shift left (desplazamiento a la izquierda) "<<"
  • Shift right (desplazamiento a la derecha) ">>"
  • Not (inverso) "~"

Or "|"

El operador "|" aplica la operación O entre dos números, hay que recordar las tablas de verdad y recordar que que se produce un valor verdadero cuando uno u otro de los valores son verdaderos.

  • Verdadero O Verdadero = Verdadero
  • Verdadero O Falso = Verdadero
  • Falso O Verdadero = Verdadero
  • Falso O Falso = Falso
Que es lo mismo:

  • 1|1 = 1
  • 1|0 = 1
  • 0|1 = 1
  • 0|0 = 0
Si escribimos lo anterior en la consola de Python, comprobamos que es correcto.


XOr "^"

El operador "^" aplica la operación O Exclusiva a dos números, de nueva cuenta, tomado las tablas de verdad tenemos:
  • Verdadero OEx Verdadero = Falso
  • Verdadero OEx Falso = Verdadero
  • Falso OEx Verdadero = Verdadero
  • Falso OEx Falso = Falso
Que es lo mismo:
  • 1^1 = 0
  • 1^0 = 1
  • 0^1 = 1
  • 0^0 = 0


And "&"

El operador "&" aplica la operación Y a dos números y tiene una tabla de verdad como la que sigue:
  • Verdadero Y Verdadero = Verdadero
  • Verdadero Y Falso = Falso
  • Falso Y Verdadero = Falso
  • Falso Y Falso = Falso
Que es lo mismo:
  • 1&1 = 1
  • 1&0 = 0
  • 0&1 = 0
  • 0&0 = 0


Shift Left "<<"

El operador "<<" mueve a la izquierda una secuencia de bits tantas veces como el número del lado derecho del operador lo indique.

Para que quede un poco mas claro, tomemos como ejemplo el número 76 decimal, cuya representación en binario es 1001100 y lo queremos desplazar a la izquierda dos lugares, entonces tenemos:
  • 76 <<  2 = 304
Pero ¿por que? Para tener una visión mas clara de que es lo que sucede, veamos la representación binaria de la misma operación
  • 1001100 << 10 = 100110000
Si observas de manera detenida, veras que la secuencia "1001100" se movió a la izquierda, pero como no había mas números, simplemente se agregaron dos ceros para completar. En Python podemos crear el código siguiente para probar que estamos en lo correcto.

MiNum = 76

print (MiNum)
print("{:b}".format(MiNum))

MiNum <<= 0b10

print(MiNum)
print("{:b}".format(MiNum))

    

Shift Right ">>"

El operador ">>" mueve a la derecha una secuencia de bits tantas veces como el número del lado derecho del operador lo indique.

Retomado número 76 pero ahora supongamos que los queremos desplazar  cuatro lugares a la derecha, entonces tenemos:
  • 76 >> 4 = 4
Nuevamente revisemos los bits para entender que es lo que sucede:
  • 1001100 >> 100 = 100
Si observamos bien vemos que en efecto, todos los bits se desplazaron a la derecha, pero cómo en este caso llegamos al limite derecho, todos los bits sobrantes se descartaron. En Python podemos crear el código siguiente para probar que estamos bien:

MiNum = 76

print (MiNum)
print("{:b}".format(MiNum))

MiNum >>= 0b100

print(MiNum)
print("{:b}".format(MiNum))



Not "~"

El operador "~" simplemente invierte una secuencia de bits, hay que tomar en cuenta que numero estamos usando, y dependiendo del mismo, Python usará mas o menos bits para guardarlo en memoria, pero además hay que tener en cuenta que al aplicar el operador a números con signo (y no digo -1 o algo por el estilo, sino a los números enteros con signo donde un byte se utiliza para indicar si el número es negativo o no) este invertirá toda la secuencia por lo que si esperamos que; por ejemplo; 10 en binario lo invierta en 01 no será así.

Para apreciar un poco más lo que sucede, tomemos el número entero de 8 bits 127, cuya representación en binario es 01111111 y es importante considerar el cero a la izquierda, ya que este nos dice que es un número positivo; al aplicar el operador ~ tenemos la secuencia de bits 10000000 que representa al número decimal -128.

Y bien, por ahora es todo, en el siguiente post veremos algunos ejemplos de la vida real en donde saber usar la operaciones a nivel de bits es de mucha ayuda.

Los leo luego

No hay comentarios.