Il conteggio inizia naturalmente da zero
Ecco l'algoritmo per contare le mele in un cestino:
count := 0
for each apple in basket
count := count + 1
Dopo l'esecuzione di quanto sopra, count
detiene il numero di mele. Può essere zero, perché i cestini possono essere vuoti.
Se non usi la tua carta di credito per un mese intero, ricevi una fattura di 1 dollaro? O 1 centesimo?
Quando ripristini il contachilometri sul contachilometri della tua auto, passa a 0001 o 0000?
Le matrici possono fornire più viste degli stessi dati
Considera una matrice di strutture a 32 bit d
, ciascuna composta da parole a 16 bit w
. Ogni parola è composta da due byte a 8 bit b
. Sotto indicizzazione zero, l'overlay sembra molto conveniente:
d: | 0 | 1 |
w: | 0 | 1 | 2 | 3 |
b: |0|1|2|3|4|5|6|7|
L'oggetto a 32 bit d[1]
come all'indirizzo della parola w[2]
che viene facilmente calcolato moltiplicando l'indice per 2, che è il rapporto tra le dimensioni dell'oggetto a 32 e 16 bit. Inoltre, nell'indirizzamento dei byte, lo è b[4]
.
Questo funziona perché zero è zero, in ogni unità di misura: byte, parola, doppia parola e così via.
Guarda il diagramma sopra: sembra molto simile a un righello, in cui le conversioni di unità sono intuitive.
Con un'indicizzazione basata, si rompe:
d: | 1 | 2 |
w: | 1 | 2 | 3 | 4 |
b: |1|2|3|4|5|6|7|8|
Ora non possiamo semplicemente moltiplicare l' d
indice per 2 per ottenere l' w
indice o per 4 per ottenere l' b
indice. La conversione tra unità diventa goffa. Per esempio per andare da d[2]
a b[4]
, dobbiamo calcolare ((2 - 1) * 4) + 1 = 5
.
Dobbiamo sottrarre quel fastidioso pregiudizio 1 nelle d
unità, quindi eseguire il ridimensionamento nel sistema di coordinate naturale basato su zero, quindi aggiungere nuovamente il fastidioso 1 in b
unità. Nota che non è lo stesso 1! Sottraiamo una larghezza di una parola doppia, ma poi aggiungiamo una larghezza di un byte .
La conversione tra diverse visualizzazioni dei dati diventa qualcosa di simile alla conversione Celsius-Fahrenheit.
Coloro che affermano che gli array a una base sono facili da gestire a livello di implementazione, poiché esiste solo una semplice sottrazione di 1, stanno prendendo in giro se stessi e te. Questo è vero solo se non eseguiamo calcoli di ridimensionamento tra diversi tipi di dati. Tali calcoli avvengono in qualsiasi programma che abbia una visione flessibile dei dati (ad es. Un array multidimensionale accessibile anche come monodimensionale) o che manipoli l'archiviazione: ad esempio un allocatore di memoria, un file system o una libreria di buffer di frame video.
Cifre minimizzanti
In qualsiasi base, se vogliamo usare il minor numero di cifre per implementare un intervallo di valori che è una potenza della base, dobbiamo iniziare da zero. Ad esempio, nella base dieci, sono sufficienti tre cifre per darci un migliaio di valori distinti da 0 a 999. Se iniziamo da 1, trabocchiamo di un solo valore e abbiamo bisogno di quattro cifre.
Ciò è importante nei computer, poiché il numero di cifre in binario si traduce in righe dell'indirizzo hardware. Ad esempio, un chip ROM con 256 parole può essere indirizzato da 0 a 255, che richiede 8 bit: da 00000000 a 11111111. Se viene indirizzato da 1 a 256, sono necessari nove bit. Dobbiamo aggiungere inutilmente un'altra traccia di indirizzo al circuito o al circuito integrato. Quindi ciò che potrebbe accadere in pratica sarebbe che 0 sarebbe semplicemente chiamato1 a livello di API software per l'accesso a quel chip. Una richiesta per la parola 1 inserisce effettivamente 00000000 nel bus degli indirizzi a 8 bit. Altrimenti, una richiesta per 1 si tradurrebbe all'indirizzo 00000001, come previsto, ma una richiesta per 256 verrebbe associata all'indirizzo a 8 bit altrimenti inutilizzato 00000000 anziché all'indirizzo a 9 bit 100000000. Entrambi questi kludges bag-biting sono davvero soluzioni in ricerca di un problema , e vengono completamente evitati utilizzando costantemente da 0 a 255 nell'hardware, nel software e in tutte le interfacce utente e documentazione.
Gli spostamenti a base singola sono fondamentalmente stupidi
Considera la teoria della musica occidentale per esempio. Abbiamo scale diatoniche con sette note, ma chiamiamo lo spazio che coprono un'ottava ! L'inversione degli intervalli segue quindi la regola del nove : ad esempio l'inversione di un terzo è un sesto (sottrarre tre da nove). Quindi tre diversi numeri sono in gioco per qualcosa di così semplice: sette (note in scala), otto (ottava) e nove (sottrarre da per invertire).
Se sette note formassero una setta o un'ottava e gli intervalli fossero basati su zero, sottrarremmo da sette a invertiti. Tutto basato su sette.
Inoltre, gli intervalli potrebbero essere facilmente impilati. Nel sistema attuale, se saltiamo di un quinto e poi di nuovo di un quarto, e poi di un terzo, non possiamo semplicemente aggiungerli. L'intervallo risultante è due in meno. Non è un dodicesimo, ma in realtà un decimo! In ogni fase, dobbiamo sottrarre uno. Salire di un quinto e poi di un quarto non è un nono, ma solo un'ottava.
In un sistema musicale progettato in modo sano, potremmo semplicemente aggiungere intervalli per determinare i salti risultanti. Una sequenza di note che inizia e finisce sulla stessa nota avrebbe quindi una proprietà simile alla legge della tensione attorno a un circuito: tutti gli intervalli si sommerebbero a zero.
La teoria e la scrittura della musica sono molto obsolete. La maggior parte non è cambiata dai tempi in cui la composizione era fatta con penne d'oca alla luce di una candela.
I sistemi a base unica confondono le stesse persone che non sono in grado di gestire matrici a base zero
Quando è iniziato il 2000, molte persone erano confuse sul perché il nuovo millennio non è iniziato. Coloro che hanno sottolineato che non inizierà fino al 2001 sono stati considerati cacca di partito e abitanti. Dopo tutto, hai compiuto 20 anni quando compi 20 anni, giusto? Non quando compirai 21 anni. Se pensavi che il millennio fosse iniziato il 1 ° gennaio 2000, allora non hai il diritto di lamentarti di array a base zero in qualsiasi linguaggio di programmazione. Funzionano esattamente come ti piace. (Ma sì, i sostenitori degli spostamenti e degli array basati su una sola base sono dweebs e pop-poopers. I secoli dovrebbero iniziare negli anni XX00 e millenni negli X000 anni.)
I calendari sono stupidi, ma almeno l'ora del giorno è a base zero
Ogni nuovo minuto sull'orologio inizia con: 00 secondi. Ogni nuova ora inizia con 00:00 minuti e secondi. E, almeno su un orologio di 24 ore, il giorno scorre intorno quando scatta la mezzanotte e 11:59:59 passa alle 00:00:00.
Quindi, se vuoi calcolare i secondi da mezzanotte per un tempo come 13:53:04, devi solo valutare 13 * 3600 + 53 * 60 + 4
. Nessuna 1
aggiunta o sottrazione insipida .
Rant di chiusura su MIDI
Ok, che succede con i musicisti, anche quelli presumibilmente tecnici?
MIDI! Utilizza la numerazione in base zero per programmi e canali nella rappresentazione filo reale dei messaggi, ma gear lo mostra come 1 basato! Ad esempio, i programmi da 0 a 127 sono chiamati da 1 a 128 sulla maggior parte degli ingranaggi, ma alcuni li chiamano da 0 a 127 o addirittura offrono all'utente una scelta.
I programmi da 71 a 80 sono considerati una "banca" di dieci. Lo dice proprio sul mio pedale MIDI, per esempio. Gli interruttori a pedale sono etichettati da 1 a 10 e se sono nel settimo banco, selezionano i programmi da 71 a 80. Tuttavia, alcuni dispositivi o software visualizzano i numeri di programma 1-128 come da 0 a 127, o forniscono all'utente un scelta! Cosa c'è di peggio: sistemi basati su uno o caos creati usando contemporaneamente uno e uno zero?
I numeri dei canali MIDI sono chiamati da 1 a 16, ma sono rappresentati da 0 a 15 binari. Come per dispetto per la presentazione a base singola, alcuni dispositivi utilizzano un dispswitch per configurare un numero di canale e, spesso, questi switch usano solo il codice binario a base zero. Quindi, se si desidera il canale 3, è necessario impostarlo su 0010 (binario 2).