Autor: @jantoniorobledo
Hoy vamos a ver un tema muy
cercano al hierro y a su vez a las
matemáticas pero unido con los sistemas operativos, aplicaciones, lenguajes de
programación... Vamos a ver en qué consisten las unidades de información, los
diferentes sistemas numéricos usados en nuestro mundillo y algo de lógica booleana.
Definiciones
Lo primero es lo primero, ¿qué es
eso de los unos y los ceros? Casi seguro que todos lo sabéis. Se trata de bits (acrónimo de Binary Digits), que
es la unidad mínima de información que puede manejar un sistema digital. A
nivel de la máquina, de una forma muy simplista pero válida, la presencia o
ausencia de señal eléctrica es lo que define a su vez el estado uno o cero:
encendido o apagado. Se suele representar con la letra b minúscula
¿Qué pasa si agrupo varios bits?:
pues que obtenemos estructuras de información más complejas. Repasemos las
principales:
Byte: consiste en un conjunto agrupado de 8 bits (normalmente).
Ocasionalmente, y para no usar el anglicismo, también lo llamamos octeto. Lo
representamos con la letra B mayúscula. Tiene 28=256 valores
posibles.
Una cuestión importante cuando
hablamos de los bits dentro de un byte es del peso del mismo. Todos habréis
oído eso de “bit más significativo” o “bit menos significativo”.
El bit menos significativo o LSB
(Least Significant Bit) hace referencia al bit más a la derecha, el que menos
valor tiene ya que su peso es de 20=1
multiplicado por su valor, es decir vale 1 en decimal si el bit vale 1 y vale 0
en decimal si el bit vale 0.
El bit más significativo o MSB
(Most Significant Bit) es el bit más a la izquierda, el que más valor o peso
tiene: 27=128, es decir, que si el octavo bit es 1 vale 128 en
decimal y si es 0, pues obviamente, también vale 0 en decimal.
En ciertos métodos estenográficos
se usa el LSB para ocultar información porque su alteración es despreciable si
el valor se “usa” de forma analógica, como puede ser el valor de color de un
pixel o la amplitud de una onda de sonido.
Word: o palabra. En la estructura x86 es un conjunto de 16 bits, o
2 Bytes pero se mantiene por compatibilidad en la arquitectura x86-64 con el
mismo tamaño. Tiene 216= 2562=65536 valores posibles.
DWord: o doble palabra…pues el doble que la anterior: 32 bits, 4
Bytes o 2 palabras. Tiene 232= 655362=4294967296 valores
posibles.
QWord: o cuádruple palabra. Otra vez doblamos la anterior: 4 bits,
8 Bytes, 4 palabras o 2 doble palabras y como en los casos anteriores elevamos
al cuadrado el numero anterior de valores posibles: tiene 264=
42949672962=18446744073709551616 valores posibles!
Sistemas numéricos usados en informática
En nuestro mundo usamos 4
sistemas: binario, octal, decimal y hexadecimal. La realidad es que el sistema
octal apenas se usa, pero por lo menos que sepáis de su existencia.
Binario: se representa con dos dígitos o guarismos diferentes ya
que solo puede tener dos posibles valores: 0 y 1. Es el mas básico y el que usa
el ordenador internamente, la información se almacena, sea en disco, memoria,
registros de CPU, etc., con este sistema…ya veremos qué pasa cuando llegue la
informática quántica! J
Octal: en este caso que puede tener 8 valores diferentes usa 8
guarismos: 0, 1, 2, 3, 4, 5, 6, 7. En un sistema de base 8 que se usaba para
representar triadas de números binarios o bits. Para que veáis un caso donde todavía
se usa: cuando cambiamos los atributos de un archivo/directorio en Linux con
chmod y usamos algo así como chmod 750 mifichero,
ese 750 son valores octales:
·
7 octal = 111 binario = rwx en nuestros
atributos de Linux.
·
5 octal = 110 binario = rw- en nuestros
atributos de Linux.
·
0 octal = 000 binario = --- en nuestros
atributos de Linux.
Evidentemente, en este caso, como
los valores se representarían igual en decimal o hexadecimal que en octal no se
ve claramente que este sea el sistema numérico usado.
Decimal: el sistema más universal y que usamos a diario en nuestra
vida cotidiana. Es un sistema de base 10 cuyas cifras se representan con 10
guarismos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
Hexadecimal: Este sistema se usa de forma casi exclusiva en el
mundo de la computación. Es un sistema de base 16 que representamos con los
siguientes 16 guarismos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F que
tienen el valor decimal de 0 a 15 para la F. Su uso esta tan extendido porque
permite representar el valor de un Byte con dos dígitos: 11111111 binario = 255
decimal = FF hexadecimal.
Cuando nos referimos a valores
hexadecimales, y para evitar confusión con otras bases, los debemos representar
con 0x (cero x) delante del valor, como por ejemplo 0xFF o 0x1234. También los
podremos encontrar con una letra h (minúscula o mayúscula) detrás de la cifra:
FFh o 1234H.
Tabla ASCII con los valores decimal,
hexadecimal y octal de algunos caracteres.
Equivalencia de los primeros valores en los
cuatro sistemas de numeración
Evidentemente el cambio de base
de un valor es relativamente sencillo y os recomendaría que busquéis vosotros
mismos información y aprendáis a hacerlo. Familiarizarse con esta parte de las
matemáticas es tremendamente útil en nuestra profesión!
Lógica binaria
Este es un tema que usamos todos
los que nos dedicamos a la informática, seamos programadores, nos dediquemos a
redes y o sistemas…
Esta lógica está basada en el álgebra de Boole
y aunque existen más operaciones, solo vamos a ver las más usuales:
·
Negación o complemento (NOT)
·
Suma o disyunción (OR)
·
Multiplicación o conjunción (AND)
·
Suma o disyunción exclusiva (XOR)
Negación o complemento (NOT)
Este operador invierte el valor
al que se le aplica. La negación del valor binario 1 es 0 o dicho de otra
forma: 1 = NOT 0. En programación se suele usar el signo de la exclamación
cerrada (!) para representarlo, de forma que 1!=0.
Para representar las salidas en
función de las entradas de un operador lógico se usan las tablas de la verdad.
La siguiente es la tabla de la verdad del operador NOT:
En secuencias lógicas, como las
que podemos escribir en los filtros del Wireshark, usamos el operador para
indicar que aplique el filtro si no se cumple la condición.
Si por ejemplo quiero que solo
capture los paquetes UDP pondré la condición en el filtro como muestro a
continuación:
Pero si lo que quiero es que
capture todos los paquetes excepto los UDP usaré el operador NOT para
indicarlo:
¿Qué ocurre si aplico este operador a un byte completo?,
pues que todos los bits de ese byte se invierten: 10010110!=01101001.
Suma o disyunción (OR)
La suma lógica requiere de 2 o más
entradas con las que operar, básicamente se puede decir que el resultado en 1
si cualquiera de las entradas tiene el valor 1. En programación se suele usar tanto el término
OR como el doble pipeline (||). La tabla de la verdad de este operador es la
siguiente:
Usemos de nuevo los filtros de captura de Wireshark para
mostrar cómo usar este operador en una sentencia lógica: siguiendo con el
ejemplo anterior, quiero hacer un filtro que capture todos los paquetes que no
sean UDP o que sean peticiones al puerto 80:
Si aplicamos el operador a un par de Bytes se hará la
operación bit a bit para cada posición: 01010001 OR 11000100 = 11010101
Multiplicación o conjunción (AND)
La conjunción AND requiere que
las dos entradas sean 1 para que la salida sea 1, en cualquier otro caso la
salida es 0. Se suele indicar tanto con el término AND como con el doble
ampersand (&&). Su tabla de la verdad es la siguiente:
Sigamos con los filtros de
captura de Wireshark para ver su uso en sentencias lógicas. Ya teníamos un
filtro donde capturábamos todos paquetes que no fueran UDP o que fueran
peticiones al puerto 80. Ahora queremos incluir la condición que sea del
protocolo IPv6 (ojo a los paréntesis para agrupar las operaciones):
Vamos a operar un par de Bytes con este operador que también
se hará la operación bit a bit para cada posición: 01010001 AND 11000100 = 1000000
Este operador también se usa para calcular la dirección base
de una red usando como entradas la dirección Ip y la máscara de subred (en
formato binario ambas).
Suma o disyunción exclusiva (XOR)
Este operador, usada en los
sumadores digitales junto a un operador AND, de una resultado de 1 solo si solo
una de las entradas es 1. Esta es su tabla de la verdad:
Este operador no se usa en los
filtros de Wireshark por lo que omito el ejemplo de uso, en cambio si es usado
en creación de máscaras de imagen, en criptografía, generación de números
pseudo-aleatorios, detección de correlación y secuencia… También nos permite calcular
la dirección de broadcast de una red usando como datos de entrar la dirección
Ip y la máscara de subred.
Todas estos operadores (excepto
NOT) tienen sus correspondientes “versiones” negadas: NOR, NAND y XNOR que
tienen el resultado de salida invertido a sus “versiones” no negadas.
En un contexto típico de
programación no nos referimos a los valores lógicos 1 y 0 de esta forma, se
suele usar True y False respectivamente para inicializar variables, comparar en
sentencias de control, etc.
Lo que hemos visto en este post
es un tema, que no es que sea de obligado conocimiento, es necesario controlar
para poder desenvolvernos con soltura en el mundo de la informática.
No hay comentarios:
Publicar un comentario