El conteo comienza naturalmente en cero
Aquí está el algoritmo para contar manzanas en una canasta:
count := 0
for each apple in basket
count := count + 1
Después de la ejecución de lo anterior, count
contiene el número de manzanas. Puede ser cero, porque las cestas pueden estar vacías.
Si no usa su tarjeta de crédito durante todo un mes, ¿recibe una factura de 1 dólar? O 1 centavo?
Cuando reinicia el medidor de viaje en el cuentakilómetros de su automóvil, ¿va a 0001 o 0000?
Las matrices pueden proporcionar múltiples vistas de los mismos datos.
Considere una matriz de estructuras de 32 bits d
, cada una compuesta de palabras de 16 bits w
. Cada palabra se compone de dos bytes de 8 bits b
. Bajo cero indexación, la superposición se ve muy conveniente:
d: | 0 | 1 |
w: | 0 | 1 | 2 | 3 |
b: |0|1|2|3|4|5|6|7|
El objeto de 32 bits d[1]
como en la dirección de la palabra w[2]
que se calcula fácilmente multiplicando el índice por 2, que es la relación de los tamaños del objeto de 32 y 16 bits. Además, en el direccionamiento de bytes, lo es b[4]
.
Esto funciona porque cero es cero, en cada unidad de medida: byte, palabra, palabra doble, etc.
Mire el diagrama anterior: se parece mucho a una regla, donde las conversiones de unidades son intuitivas.
Con una indexación basada, rompe:
d: | 1 | 2 |
w: | 1 | 2 | 3 | 4 |
b: |1|2|3|4|5|6|7|8|
Ahora no podemos simplemente multiplicar el d
índice por 2 para obtener el w
índice, o por 4 para obtener el b
índice. La conversión entre unidades se torna torpe. Por ejemplo, para ir de d[2]
a b[4]
, tenemos que calcular ((2 - 1) * 4) + 1 = 5
.
Tenemos que restar ese sesgo molesto 1 en las d
unidades, luego escalar en el sistema de coordenadas natural basado en cero y luego volver a agregar el molesto 1 en b
unidades. Tenga en cuenta que no es lo mismo 1! Restamos el ancho de una palabra doble, pero luego agregamos un ancho de byte .
La conversión entre diferentes vistas de los datos se convierte en algo así como la conversión de Celsius-Fahrenheit.
Aquellos que dicen que las matrices basadas en uno son fáciles de tratar en el nivel de implementación, porque solo hay una simple resta de 1, se engañan a sí mismos y a usted. Esto es cierto solo si no hacemos cálculos de escala entre los diferentes tipos de datos. Dichos cálculos se realizan en cualquier programa que tenga una visión flexible de los datos (por ejemplo, una matriz multidimensional a la que también se accede como unidimensional) o que manipule el almacenamiento: por ejemplo, un asignador de memoria, un sistema de archivos o una biblioteca de búfer de cuadros de video.
Minimizando Dígitos
En cualquier base, si queremos usar la menor cantidad de dígitos para implementar un rango de valores que es una potencia de la base, debemos comenzar desde cero. Por ejemplo, en la base diez, tres dígitos son suficientes para darnos mil valores distintos de 0 a 999. Si comenzamos desde 1, nos desbordamos en un solo valor y necesitamos cuatro dígitos.
Esto es importante en las computadoras, porque la cantidad de dígitos en binario se traduce en líneas de dirección de hardware. Por ejemplo, un chip ROM con 256 palabras puede direccionarse de 0 a 255, lo que requiere 8 bits: 00000000 a 11111111. Si se direcciona de 1 a 256, se necesitan nueve bits. Tenemos que agregar un derroche de dirección más a la placa de circuito o circuito integrado. Entonces, lo que posiblemente sucedería en la práctica sería que 0 simplemente se llamaría1 en el nivel de API de software para acceder a ese chip. Una solicitud de la palabra 1 en realidad pondría 00000000 en el bus de direcciones de 8 bits. O bien, una solicitud de 1 se traduciría a la dirección 00000001, como se esperaba, pero una solicitud de 256 se correlacionaría con la dirección de 8 bits 00000000 que de otro modo no se utilizaría, en lugar de la dirección de 9 bits 100000000. Ambos de estos errores son realmente soluciones. búsqueda de un problema , y se evitan por completo mediante el uso constante de 0 a 255 en el hardware, en el software y en todas las interfaces de usuario y documentación.
Los desplazamientos basados en uno son fundamentalmente estúpidos
Considere la teoría de la música occidental, por ejemplo. Tenemos escalas diatónicas con siete notas, ¡pero llamamos al espacio que cubren una octava ! La inversión de intervalos sigue la regla de nueve : por ejemplo, la inversión de un tercio es un sexto (restar tres de nueve). Entonces, tres números diferentes están en juego para algo tan simple: siete (notas en una escala), ocho (octava) y nueve (restar de a invertir).
Si siete notas formaran un septave o heptave, y los intervalos estuvieran basados en cero, entonces restaríamos de siete para invertir. Todo basado en siete.
Además, los intervalos se pueden apilar fácilmente. En el sistema actual, si saltamos por un quinto y luego por un cuarto nuevamente, y luego por un tercero, no podemos simplemente agregarlos. El intervalo resultante es dos menos. ¡No es un duodécimo, sino un décimo! En cada etapa, tenemos que restar uno. Subir por un quinto y luego un cuarto no es un noveno, sino solo una octava.
En un sistema de música con un diseño sensato, podríamos agregar intervalos para determinar los saltos resultantes. Una secuencia de notas que comienza y termina en la misma nota tendría una propiedad similar a la ley de voltaje alrededor de un circuito: todos los intervalos se sumarían a cero.
La teoría de la música y la escritura están muy desactualizadas. La mayor parte no ha cambiado desde los días en que la composición se hacía con plumas a la luz de una vela.
Los sistemas basados en uno confunden a las mismas personas que no pueden manejar matrices basadas en cero
Cuando llegó el año 2000, muchas personas estaban confundidas por qué el nuevo milenio no había comenzado. Aquellos que señalaron que no comenzará hasta 2001 fueron considerados como cacahuetes y pandilleros. Después de todo, tienes 20 años cuando cumples 20, ¿verdad? No cuando cumpla 21 años. Si pensaba que el milenio comenzó el 1 de enero de 2000, no tiene derecho a quejarse de matrices basadas en cero en ningún lenguaje de programación. Funcionan exactamente como te gusta. (Pero, sí, los defensores de los desplazamientos y matrices basados en uno son imbéciles y fiesteros. Los siglos deberían comenzar en los años XX00 y milenios en los años X000).
Los calendarios son tontos, pero al menos la hora del día es cero
Cada nuevo minuto en su reloj comienza con: 00 segundos. Cada nueva hora comienza con 00:00 minutos y segundos. Y, al menos en un reloj de 24 horas, el día llega cuando son las doce de la noche y los incrementos de 11:59:59 a 00:00:00.
Por lo tanto, si desea calcular segundos desde la medianoche para un tiempo como 13:53:04, solo tiene que evaluar 13 * 3600 + 53 * 60 + 4
. Sin 1
adiciones o restas insípidas .
Discurso de clausura sobre MIDI
Bien, ¿qué pasa con los músicos, incluso los supuestamente técnicos?
MIDI! Utiliza numeración basada en cero para programas y canales en la representación real de los mensajes, ¡pero el engranaje lo muestra como 1! Por ejemplo, los programas 0 a 127 se llaman 1 a 128 en la mayoría de los equipos, pero algunos los llaman 0 a 127 o incluso le dan al usuario una opción.
Los programas 71 a 80 se consideran un "banco" de diez. Lo dice justo en mi pedal MIDI, por ejemplo. Los pedales están etiquetados del 1 al 10 y si estoy en el séptimo banco, eligen los programas 71 a 80. Sin embargo, algunos dispositivos o software de computadora muestran los números de programa 1-128 como 0 a 127, o incluso le dan al usuario un ¡elección! Lo que es peor: ¿sistemas basados en uno o caos creado usando tanto uno como cero al mismo tiempo?
Los números de canal MIDI se llaman del 1 al 16, pero están representados por 0 a 15 binarios. Como a pesar de la presentación basada en uno, algunos equipos usan un interruptor de disps para configurar un número de canal y, a menudo, estos interruptores solo usan el código binario basado en cero. Entonces, si desea el canal 3, debe alternarlo a 0010 (binario 2).