Manejando bits

Importancia del manejo de los bits en el mundo de la programación.
Como bien es conocido un Byte es la agrupación de 8 bits respectivamente, cada bit forma parte del sistema de numeración Binario a quien debe su nombre, es decir de base 2 en otras palabras puede almacenar valores comprendidos entre 0 y 1.

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"
Donde Número es el valor expresado dentro del sistema, base como su nombre lo indica la base del sistema (si es binario : 2 , octano: 8, decimal: 10, hexadecimal : 16, etc…) y n la posición que ocupa el digito "N" dentro del 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…

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)

Como refería anteriormente, la tabla ASCII incluye todos los caracteres validos dentro del computador, desde todas las letras en minúsculas y mayúsculas, números y otros especiales, estos últimos utilizados en su mayoría como delimitadores o separadores guía dentro de un formato de archivo de contenido binario (PDF, DOC, EXE, DLL, OCX, ENTRE OTROS) Ejemplo de delimitadores: La dirección IP incluye 4 pares de cuyo valor máximo es 255 para poder representarlo en decimal se hace más que necesario, obligatorio el uso de delimitadores por lo cual se emplea un ". (Punto)" de modo tal que 255.255.255.255, para reducir esta información a 4 bytes podremos acudir a la tabla ASCII.

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.

1286232 168 421
12 3 4 5 6 7 8(bits)

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:

1286232168 421
10111011

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.

  1. 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(32*2)=64
    1 bit2 bits

  2. 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 8

    por tanto si dividimos
    (128 / 2)=64(64/2)=32(32/2)=16(16/2)=8
    1 bit2 bits3 bits4 bits

    Se 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.

Concuclusió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.