Seleccionar página

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.