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 ;-)

14 comentarios:

  1. No conozco PHP, pero apuesto a que substr(‘Contraseña’, 0, 5) da como resultado ''Contr''. Otra cosa es que estuvieses pensando en poner substr(''Contraseña'',1,5)

    ResponderEliminar
  2. Gracias, Sheldon. Era una errata.Corregido.

    ResponderEliminar
  3. 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7Esta serie no esta bien:000 - 001 - 010 - 011 - 100 - 101 - 110 - 111Esta si000 - 100 - 010 - 110 - 001 - 101 - 011 - 111

    ResponderEliminar
  4. no todos los lenguajes de programación son así, Xpath(el estándar para manejar xml)empieza siempre en 1, y ECMAScript(la versión ''limpia'' y estandarizada de javascript)empieza en 1 o en 0 según cómo se señale la posición de un array...

    ResponderEliminar
  5. little-endian versus big-endian22 de enero de 2008, 16:16

    para ''yo''.Ambas series están bien, depende de que consideres que el bit más significativo está a la izquierda o a la derecha. Depende de que sean un procesador Intel o uno PowerPC ;-)

    ResponderEliminar
  6. Para Yo:Estamos contando con diferentes criterios: uno en ''little-endian'' y el otro en ''big-endian''.En mi opinión, ninguna de las dos es incorrecta.

    ResponderEliminar
  7. Te equivocas: los informáticos no contamos para nada en el mundo.Solo somos los criados tontos que les hacemos las cuentas a millonarios, multinacionales, pudientes y poderosos.Hay trabajos que influyen en el mundo, en la historia, en la politica.El trabajo de informático es el trabajo de autoexcluidos sociales que nos creemos mas listos por que sabemos contar solo con dos dedos.Pero lo único que aportamos al mundo es nuestro ego, autismo y facilitarles el trabajo a los que toman decisiones, muchas veces destructivas.Lo único que se aprende del trabajo de informático es lo egoista, inútilmente creido, insolidario y superfluo que es nuestro trabajo.Tiene mas valor ético el trabajo del mas inculto y paleto agricultor.El articulo es muy didáctico pero solo lo apreciará el que ya lo sepa, ninguna persona inculta quiere aprender nada y no lo leera. Es solo un buen ejercicio de egolatria autosuficiente. Contar 0 y 1 no mejora el mundo.Como sugerencia: publica textos sobre personas y hechos relacionados con informática que si importan y llegan al corazón, que a veces los publicais muy buenos.©Este texto ha sido codificado con ROT26. Se perseguirá criminalmente todo intento de traducir este codigo.

    ResponderEliminar
  8. Matematicamente, todos los sistemas numericos occidentales colocan en el lado izquierdo los digitos con mayor valor. Esto es, no es lo mismo deber 5000000 de euros que deber 0000005. Esto es asi en sistema binario, decimal, hexadecimal o base-40

    ResponderEliminar
  9. David Asorey Álvarez22 de enero de 2008, 17:51

    Dividido por cero:Tomo nota de tu sugerencia. Es una excelente idea.Gracias.

    ResponderEliminar
  10. Creo que la razón de ''que el 0 también contiene información'' no es válida. El 5 ''también contiene información'' y no se suele empezar por él (aunque se podría).La razón me parece ser el uso de ''cero'' y ''uno'' como ''nada'' y ''algo'', ''magnetizado''-''no magnetizado'', ''abierto'' y ''cerrado'' de los primeros dispositivos y esquemas (circuitos lógicos), que llevó a la forma de expresión de los números en sistema binario como se indica en el artículo.

    ResponderEliminar
  11. [...] la red, que encajan bastante bien con lo que estamos viendo en clase de Tecnología. El primero es este artículo que apareció hace unos días en el blog de David Asorey, programador informático del diario [...]

    ResponderEliminar
  12. jajaj si esq los informaticos somos lo peor...el otro dia de botellon con amigos informaticos acabamos rallandonos la cabeza con la forma habitual de contar con los dedos y la forma binaria de contar con los dedos. cada dedo es una potencia de 2, así que por ejemplo cno la mano derecha: pulgar-> 2^0; indice -->2^1 etc...así que podríamos llegar a contar con una sola mano de 0 a 31, y por ejemplo el gesto típico de ronaldinho sería 17 en decimal: 2^0 + 2^5, ( dedo pulgar y meñique respectivamente) y acabamos desvaríando con el dicho: con las manos de los dedos y las manos de los pies, los cojones y la polla todos suman 23, así que podríamos contar hasta 2^23 bastante más que de la forma habitual...jajajaespero q hayas entendido lo q intento explicarte...es interesante así que si no me explicado bien, intentaré ser mas claro !! saludosssssssss

    ResponderEliminar
  13. > el otro dia de botellon con amigos informaticos acabamos> rallandonos la cabeza con la forma habitual de contar con los> dedos y la forma binaria de contar con los dedos¡Estáis locos! ¿Qué le echasteis al botellón? ;-)> así que por ejemplo cno la mano derecha: pulgar-> 2^0; indice –>2^1 etc…Eso sería ''little-endian'', ¿no? Aunque mejor se llamaría ''pulgar-endian'' xDDD

    ResponderEliminar
  14. Quisiera saber si alguien tiene la definición de los que es una pulga en informática?

    ResponderEliminar