Mostrando entradas con la etiqueta numeración. Mostrar todas las entradas
Mostrando entradas con la etiqueta numeración. Mostrar todas las entradas

martes, 22 de enero de 2008

Los informáticos contamos empezando por 0

A veces tengo que llamar a un servicio técnico que funciona de la siguiente forma: llamo, digo quién soy, qué problema tengo y a continuación me validan una contraseña que nos han asignado. Por seguridad (no es muy recomendable decir la contraseña en voz alta rodeado de gente), en vez de pedirme la contraseña completa, me piden sólo algunas letras o cifras de la misma: "por favor, dígame las posiciones 1, 6 y 7 de su contraseña".

La primera vez que llamé no fui capaz de decirle las letras que me pedía hasta el tercer intento por lo menos. ¿Qué pasó?
Sencillo: estaba contando los caracteres como si estuviese programando, empezando por 0.

Normalmente, procederíamos así a la hora de contar (en la línea de arriba, la palabra, en la de abajo, la numeración o posiciones):
 C | o | n | t | r | a | s | e | ñ | a

 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10

Sin embargo, un programador contará así:
 C | o | n | t | r | a | s | e | ñ | a

 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Casi todos los lenguajes de programación y sistemas siguen este esquema: empezar a contar desde cero. ¿Por qué se hace de esta forma tan poco intuitiva?
La razón que me parece más sencilla es la siguiente: el número 0 también contiene información.

Cuando utilizamos los números naturales para contar empezamos con el 1 porque el 0 no tiene significado: si no hay nada que contar, no contamos. Si hay algo que contar, empezamos por la unidad: "una manzana, dos manzanas, ..."

Sin embargo en los ordenadores cuando contamos en realidad lo que estamos es enumerando direcciones o posiciones.
Vamos a ver un sencillo ejemplo:

Supongamos que tenemos una ínfima memoria RAM de 8 bytes. Esto quiere decir que sólo disponemos de 8 "huecos", "casillas", posiciones o direcciones de memoria.
Podemos pensar en la memoria RAM como en un montón de buzones de correo apilados.

Si queremos acceder a una de estas direcciones para recuperar el contenido o escribir algo necesitamos saber su dirección. Como sabemos, los ordenadores sólo utilizan ceros y unos para contar, así que con tres bits seremos capaces de direccionar toda la memoria:
000 - 001 - 010 - 011 - 100 - 101 - 110 - 111

Estas ternas de números binarios son en el sistema decimal:
0 - 1 - 2 - 3 - 4 - 5 - 6 - 7

Así que tendremos el buzón 0, el buzón 1, el buzón 2, ... hasta el buzón 7. Total, 8 buzones.
Si nos hubiésemos empeñado en numerar los buzones desde el número 1 no nos hubiesen bastado 3 bits (*), puesto que el número 8 en binario es 1000 (**).

Los mayoría de los lenguajes de programación trata las cadenas de texto de la misma forma. Por ejemplo, el lenguaje PHP (con el cual están programados estos blogs) tiene una función o instrucción para extraer parte de una cadena de texto:
substr('Contraseña', 1, 5) nos proporciona 5 caracteres de la palabra 'Contraseña' a partir de la posición 1, esto es, "ontra".
Como ven, también cuentan desde 0.


Notas

(*) Existe una regla muy sencilla para saber cuántas posiciones podemos abarcar con n bits: 2^n.

  • Con 3 bits podemos contar 2^3 = 8 posiciones, esto es, del 0 al 7.

  • Con 4 bits podemos contar hasta 2^4=16 posiciones (del 0 al 15).


Un ordenador que funcione con 32 bits (los Pentium "clásicos", por ejemplo) podrá direccionar 2^32 = 4.294.967.296 direcciones, es decir, 4 Gigas de memoria. No compre más memoria que esta cantidad para su viejo Pentium. No podrá utilizarla.

(**) A los informáticos también se nos dan muy bien las potencias del número 2. Pregúntenle a un programador "¿cuanto es 2^10?". Seguro que le contesta con bastante rapidez ;-)