Qué son los bits. Qué uso e instrucciones podemos dar a los bits en lenguajes de programación. Cuál es la Importancia del manejo de los bits al programar algoritmos.
Los ordenadores trabajan todo con ceros y unos! Si lo piensas quizás no te deje de asombrar cómo es posible que toda aplicación, juego, vídeo, etc. esté codificado solamente com ceros y unos y se pueda llegar conseguir cosas tan asombrosas.
La mayoría de las veces puede que no te aporte mucho estudiar cómo es posible que los ordenadores consigan manejar todo con ceros y unos y cómo se organiza a bajo nivel para conseguirlo. Pero a veces trabajar con unidades como los bits o bytes es necesario para algunos tipos de operaciones que se pueden llegar a realizar en la programación. En este artículo queremos ver en qué casos puede ser esto necesario.
Hemos colocado este artículo como uno de los epílogos del Manual de Iniciación a la Programación pero igual es algo más avanzado del resto de los artículos que contiene, que se quedan en lo más básico. Si estás leyendo ese manual y esta información se te queda un poco grande, no te preocupes... vuelve cuando quieras o tengas curiosidad para qué sirven las operaciones a nivel de bit de los lenguajes de programación.
Bits y Bytes
Por supuesto, a partir de los ceros y de los unos, el ordenador organiza también unidades a agrupar varios ceros y unos. Tenemos que conocer estas unidades usadas por los ordenadores:
- Bit: un bit es la unidad mínima de información en un ordenador. Corresponde con un cero o un uno. Es decir, el bit es una unidad de información que puede tener dos valores, el cero o el uno. El bit forma parte del sistema de numeración Binario, a quien debe su nombre. El binario quiere decir la numeración en base 2 que puede almacenar valores comprendidos entre 0 y 1.
- Byte: Byte es la agrupación de 8 bits. Es una unidad de almacenamiento en la memoria que consta de la agrupación de 8 bits.
Entendiendo los sistemas de numeración
Los sistemas de numeración definen el conjunto de valores que podemos utilizar para conseguir expresar cualquier número. Por ejemplo, nosotros usamos el sistema decimal normalmente, porque tenemos 10 posibles valores para expresar números, del cero al 9, pero los ordenadores usan el binario, que tiene dos posibles valores, el cero y el uno.
Si bien recordamos que un sistema de numeración se conforma de un conjunto de reglas y principios que permite expresar o definir un número valido dentro del mismo, podemos afirmar que la mayoría de ellos (Sistemas: binarios, octanos, decimales hexadecimales, etc..) se pueden representar mediante un polinomio sencillo que nos permitirá entender su lógica:
Número = N*basen + N*basen-1+ N*basen-2
, hasta que base quede elevado a la 0 siempre y cuando no contenga decimales el "Número"
Ejemplos en sistema decimal (base 10):
18598 1*10 4 + 8*10 3 + 5*10 2 + 9*10 1 + 8*10 0
Hemos descompuesto el valor expresado "18598" multiplicándolo por la base del sistema (10) elevada a la posición del digito en la expresión.
El número 1 se encuentra iniciando la expresión y guarda en su interior 10 000 (Para comprobarlo: si eliminamos el 1 el resultado será (18598-10 000)) por lo tanto 10 000 es igual a 10 4 (1*104)=10 000 + (8*103)= 8 000
Ejemplo en sistema binario (base 2):
En el sistema de numeración binario la misma formula es aplicable:
10 (número binario) = 1*2 1 + 0*2 0
Lo que indica que 10, en el sistema decimal es igual 2, en realidad en el sistema de numeración binario se puede definir cualquier número entero mayor o igual a 0, sin embargo la estructura de almacenamiento Byte solo fue diseñada desde su origen para almacenar hasta 256 porque incluye como máximo 8 bits (28 = 256) (recordemos que se toma en cuenta el 0 por lo cual 255 equivaldrá a 256) y se escogió este valor como máximo porque es la totalidad de caracteres disponibles en la tabla ASCII, que incluye todos los caracteres validos dentro de un computador, para comprobar esto podemos guardar un carácter en un archivo sin formato y como resultado tendremos que siempre ocupará 1 byte, si colocamos 2 caracteres el tamaño del archivo será igual a 2 bytes. Lo que justifica que 1 byte = 8 bits = puede almacenar hasta 256. y 1 bit es la mínima unidad en la que se puede almacenar información, Ejemplo: el tipo booleano (bool) ocupa en memoria 1 bit, por tanto TRUE = 1 FALSE=0.
Por esta razón la mayoría de los hardwares con capacidad de almacenamiento tales como Discos duros, memorias, y otros dispositivos; su capacidad siempre será divisible entre 2 , al igual que las demás estructuras de almacenamiento ( Kb, Mb, Gb, Tb, etc)
Por ejemplo el carácter "A" dentro de la tabla ASCII en el sistema decimal ocupa 64, podemos ejecutar una función ampliamente reconocida por lenguajes de programación entre ellos (Delphi, C++, VB, Php, etc) llamada ORD que producirá como resultado de ord(64) "A" si por el contrario ejecutamos chr('A') es resultado será 64 en decimal, el cual representado en binario equivaldría a "1000000" , auque 64 no ocupe físicamente los 255 (1 byte completo) su tamaño en disco siempre será 1 byte, porque la mayoría de sistemas operativos y hardware desde su ensamblaje esta orientados para reservar un mínimo de espacio en memoria y en disco tomando en cuenta que ese valor puede ser modificado a 255 (máximo) ó 0 (mínimo) en cualquier momento.
Por tanto podemos decir que un bit tiene un valor de acuerdo a su posición ó ubicación y para hallar ese valor solo tenemos que descomponer 255.
128 64 32 16 8 4 2 1 1 2 3 4 5 6 7 8(bits)
Profundizando en el bit
Como comentábamos anteriormente el bit se conforma de 0 y 1 respectivamente por tanto afirmaremos a partir de ahora que 0 ES IGUAL A FALSO (false) Y 1 ES IGUAL A VERDADERO (true) si tenemos un conjunto de 8 bits lo sumaremos según su posición, siempre y cuando el bit sea VERDADERO es decir su contenido sea igual a 1, ejemplo: dado los bits "10111011" para convertirlo a decimal aplicamos la tabla:
128 62 32 16 8 4 2 1 1 0 1 1 1 0 1 1
Y posteriormente sumamos solo los valores que son "VERDADEROS" entonces: 128+32+16+8+2+1=187 ¡Enhorabuena 10111011=187!, entonces podemos decir que para almacenar 256 necesitaremos que los 8 bits sean verdaderos es decir 8 bits y ya tendemos nuestro byte.
Para hacer el proceso contrario es decir de decimales a binario, solo tenemos que descomponer el decimal dividiéndolo siempre entre 2 hasta que el valor sea igual a 1, la agrupación de los residuos obtenidos será nuestro valor binario; obviamente los residuos siempre serán (0 ó 1).
Los bits son ampliamente utilizados para codificar datos, comprimir información, etc. Por ejemplo el formato de imágenes diseñado por Microsoft (.BMP) calcula el área de la imagen es decir base por altura ó lo que es igual a ancho por alto la cual asume como la cantidad de puntos disponibles, estos puntos a su vez almacenan un color hexadecimal de 3 pares conocido como RGB que almacena los colores ROJOS, VERDE Y AZUL, por lo cual para el almacenamiento del color emplea 3 bytes (255,255,255) y los escribe con ASCII , por cada punto , lo que indica si una imagen es de 10 px x 10 px empleará 300 bytes para almacenar los puntos y otros adicionales que guardan información de propiedades y características de esencial importancia. Utilizando bytes delimitadores o separadores en caso de no conocer el final del valor, es decir si la cantidad de bytes a emplear por la cabecera del formato (que contiene información) se desconoce ó puede variar dependiendo de factores, se hace indispensable el uso de delimitadores (ASCII DEFINIDOS COMO DELIMITADORES), si por el contrario siempre se situará entre los bytes 10 y 20 por ejemplo (no será necesario). Por tal motivo cuando leemos un archivo (con un programa desarrollado por nosotros) debemos especificar cuantos bytes leeremos por cada secuencia, en el caso de los colores del formato (BMP) bastara con leer de 3 en 3, cabe destacar que un archivo se puede leer hasta 1024 es decir 1 KB de secuencia que equivale a una línea de información, a partir de esa base se han diseñado mecanismos de comprensión que agrupa los bits repetido en matrices o arrays.
Para hacer posible este manejo existen algunos operadores similares a los de lógica ( OR, AND, NOT, XOR, ETC) mejor conocidos como operadores bit a bit.
Desplazando bits:
Podemos definirlo como la acción de transportar bytes de un extremo de la expresión a otro, como la expresión esta conformada por 2 solo puede hacerse en dos sentidos, izquierda y derecha.
- Desplazando bits a la izquierda (<<)
Consiste en mover la cantidad de bit indicada en la expresión, de la izquierda a la derecha, esta operación equivale a multiplicar por 2.Por ejemplo:
16 <<2 desplazaremos 2 bits de la izquierda a la derecha
16 en binario equivale a 00010000 por lo cual moveremos los dos primeros bits a la parte de atrás del numero (derecha) de tal modo que quedará 01000000 lo cual equivale a 64.Por tanto si multiplicamos
(16*2)=32
1 bit(32*2)=64
2 bits - Desplazando bits a la derecha (>>)
Consiste en mover la cantidad de bit indicada en la expresión, de la derecha a la izquierda, esta operación equivale a dividir por 2.Por ejemplo:
128 >>4 desplazaremos 4 bits de la derecha a la izquierda.
128 en binario es igual a: 10000000, moveremos los últimos 4 bits a la parte inicial ( de derecha a izquierda) , el resultado será 00001000 cuyo valor es igual a 8por tanto si dividimos
(128 / 2)=64
1 bit(64/2)=32
2 bits(32/2)=16
3 bits(16/2)=8
4 bitsSe emplea 2 por ser la base del sistema de numeración binario.
Operador de lógica OR |
Recordemos que llamaremos 0 en binario False y 1 True, entonces el operador OR
Evaluara las expresiones y producirá TRUE es decir 1 solo si el uno de los 2 bits a comparar es igual a 1. Ejemplo:
Expresión: 5 | 12
5 en binario es igual a 00000101
12 en binario = 00001100
Resultado : 00001101 = 13
Solo si un par de los bits a comparar es 1 el resultado será 1, se comporta exactamente igual a una condición: (true || false) es igual a true; (false || false) es igual a false, su razón se debe a que la condición de dos o más argumentos se transforma siempre a binarios para realizar la comparación utilizando el procesador y la memoria de computador.
Operador de lógica AND &
Solo si el par de bits a comparar es igual a 1 el resultado será 1.
Expresión: 5 & 12
5 en binario es igual a 00000101
12 en binario = 00001100
Resultado : 00000100 = 4
Es similar a (TRUE && TRUE) es igual a true, (False && True) es igual a false.
Operador XOR ^
Solo si el par de bits a comparar es diferente será igual a 1.
Expresión: 5 ^ 12
5 en binario es igual a 00000101
12 en binario = 00001100
Resultado : 00001001 = 9
Similar a (TRUE XOR FALSE) es igual a true, ( TRUE XOR TRUE) es igual a false.
Operador Not ~
Solo si el bit a comparar es igual a 0 (False) será igual a 1.
Expresión: ~5
5 en binario es igual a 00000101
Resultado : 00000010 = 2
Similar a (!FALSE) es igual a true
Importancia del manejo de los bits
Como programador daré una opinión muy personal, se hace indispensable en la construcción de aplicaciones a gran escala el desarrollo formatos personales basados en esquemas que almacenan la información empleada de modo comprimido para la utilización de un o unos recursos de nuestra aplicación, permitiéndole al usuario final mayor comodidad y seguridad durante el transporte de la información y ofreciéndole la capacidad de hacerlas compatibles con otras aplicaciones, y dejar a un lado (dependiendo del objetivo) el típico uso de bases de datos que requieren recursos adicionales del computador además de interpretadores, etc. Considero que la información redactada contribuye considerablemente a encaminar vuestros esfuerzos en esa dirección.
Conclusión:
Podemos decir que el computador sin software solo tiene capacidades para hacer operaciones aritméticas simples (sumas, restas, multiplicación, etc)
Y es el software que valiéndose se esas simples operaciones con procesos como los antes explicados puede crear la interfaz como de la que hoy disfrutamos en materia de Sistemas Operativos, todos los lenguajes desde los más altos como Php hasta los más bajos como Assembler pasan por binario, cada vez que movemos el Mouse eso esta produciendo un procesamiento de datos binarios, en fin, orienta tus esfuerzos como programador a reducir al máximo el consumo de recursos, seguro lograras una suma consumiendo menor cantidad de recursos que lo habitual.
Emmanuel García De Caro
Webmaster de Blasten.com