Le décompte commence naturellement à zéro
Voici l'algorithme pour compter les pommes dans un panier:
count := 0
for each apple in basket
count := count + 1
Après l'exécution de ce qui précède, count
détient le nombre de pommes. Il peut être nul, car les paniers peuvent être vides.
Si vous n'utilisez pas votre carte de crédit pendant un mois entier, recevez-vous une facture d'un dollar? Ou 1 centime?
Lorsque vous réinitialisez le compteur kilométrique sur le compteur kilométrique de votre voiture, passe-t-il à 0001 ou 0000?
Les tableaux peuvent fournir plusieurs vues des mêmes données
Prenons un tableau de structures 32 bits d
, chacune composée de mots de 16 bits w
. Chaque mot est composé de deux octets de 8 bits b
. Sous zéro indexation, la superposition semble très pratique:
d: | 0 | 1 |
w: | 0 | 1 | 2 | 3 |
b: |0|1|2|3|4|5|6|7|
L'objet d[1]
de 32 bits à l'adresse du mot w[2]
qui est facilement calculé en multipliant l'indice par 2, qui est le rapport entre les tailles des objets de 32 et 16 bits. De plus, dans l'adressage d'octet, c'est le cas b[4]
.
Cela fonctionne parce que zéro est égal à zéro, dans chaque unité de mesure: octet, mot, mot double, etc.
Regardez le diagramme ci-dessus: cela ressemble beaucoup à une règle, où les conversions d'unités sont intuitives.
Avec une indexation basée, il casse:
d: | 1 | 2 |
w: | 1 | 2 | 3 | 4 |
b: |1|2|3|4|5|6|7|8|
Maintenant, nous ne pouvons pas simplement multiplier l' d
index par 2 pour obtenir l' w
index, ou par 4 pour obtenir l' b
index. La conversion entre les unités devient maladroite. Par exemple, pour aller de d[2]
à b[4]
, nous devons calculer ((2 - 1) * 4) + 1 = 5
.
Nous devons soustraire ce biais 1 embêtant dans les d
unités, puis procéder à la mise à l'échelle dans le système de coordonnées naturel à base de zéro, puis rajouter le 1 embêtant en b
unités. Notez que ce n'est pas le même 1! Nous soustrayons une double largeur de mot, mais ajoutons ensuite une largeur d'un octet .
La conversion entre différentes vues des données devient quelque chose comme la conversion Celsius-Fahrenheit.
Ceux qui disent que les tableaux à base unique sont faciles à traiter au niveau de la mise en œuvre, car il n’ya qu’une simple soustraction de 1 se leurrent, et vous. Cela n’est vrai que si nous ne faisons aucun calcul de mise à l’échelle entre différents types de données. De tels calculs sont effectués dans tout programme disposant d'une vue flexible sur les données (par exemple, un tableau multidimensionnel auquel on accède également en tant qu'un graphique unidimensionnel) ou manipulant le stockage: par exemple, un allocateur de mémoire, un système de fichiers ou une bibliothèque de mémoires vidéo.
Minimiser les chiffres
Dans n'importe quelle base, si nous voulons utiliser le moins de chiffres possible pour implémenter une plage de valeurs qui est une puissance de la base, nous devons partir de zéro. Par exemple, en base dix, trois chiffres suffisent pour nous donner mille valeurs distinctes de 0 à 999. Si nous partons de 1, nous débordons d’une seule valeur et nous avons besoin de quatre chiffres.
Ceci est important dans les ordinateurs, car le nombre de chiffres en binaire se traduit par des lignes d'adresse matérielles. Par exemple, une puce ROM contenant 256 mots peut être adressée de 0 à 255, ce qui nécessite 8 bits: 00000000 à 11111111. Si elle est adressée de 1 à 256, alors 9 bits sont nécessaires. Nous devons gaspiller une trace d'adresse supplémentaire dans la carte de circuit imprimé ou le circuit intégré. Donc, ce qui se passerait éventuellement dans la pratique serait que 0 serait simplement appelé1 au niveau de l'API logicielle pour accéder à cette puce. Une demande du mot 1 mettrait en réalité 00000000 sur le bus d’adresse à 8 bits. Sinon, une demande pour 1 se traduirait par l'adresse 00000001, comme prévu, mais une demande pour 256 serait mappée sur l'adresse 8 bits inutilisée 00000000 plutôt que sur l'adresse 9 bits 100000000. Ces deux kludges déchirants sont vraiment des solutions en rechercher un problème et sont entièrement évités en utilisant systématiquement 0 à 255, tant dans le matériel que dans le logiciel, ainsi que dans toutes les interfaces utilisateur et la documentation.
Les déplacements uniques sont fondamentalement stupides
Prenons l'exemple de la théorie de la musique occidentale. Nous avons des gammes diatoniques à sept notes, mais nous appelons l'espace qu'elles couvrent une octave ! L'inversion des intervalles suit alors la règle de neuf : par exemple, l'inversion d'un tiers est un sixième (soustrayez trois à neuf). Donc, trois nombres différents sont en jeu pour quelque chose d'aussi simple: sept (notes dans une échelle), huit (octave) et neuf (soustraire de pour inverser).
Si sept notes faisaient un septave ou un heptave et que les intervalles étaient basés sur zéro, nous soustrayions alors de sept pour inverser. Tout basé sur sept.
En outre, les intervalles pourraient être facilement empilés. Dans le système actuel, si nous sautons d'un cinquième, puis d'un quatrième, puis d'un tiers, nous ne pouvons pas simplement les ajouter. L'intervalle résultant est deux moins. Ce n'est pas un douzième, mais en réalité un dixième! A chaque étape, il faut en soustraire un. Monter d'un cinquième et ensuite d'un quart n'est pas un neuvième, mais seulement une octave.
Dans un système de musique conçu avec soin, nous pourrions simplement ajouter des intervalles pour déterminer les sauts qui en résultent. Une séquence de notes commençant et se terminant sur la même note aurait alors une propriété similaire à la loi de tension autour d'un circuit: tous les intervalles s'ajouteraient à zéro.
La théorie musicale et l'écriture est très dépassée. La majeure partie n’a pas changé depuis la composition des jours avec des plumes à la lumière d’une bougie.
Les systèmes à base unique confondent les mêmes personnes qui ne peuvent pas gérer les tableaux à base zéro
À la fin de l’an 2000, beaucoup de gens n’avaient pas compris pourquoi le nouveau millénaire n’avait pas commencé. Ceux qui ont souligné que cela ne commencerait pas avant 2001 étaient considérés comme des fous et des dweebs. Après tout, vous avez 20 ans quand vous aurez 20 ans, n'est-ce pas? Pas à 21 ans. Si vous pensiez que le millénaire a commencé le 1er janvier 2000, vous n’avez pas le droit de vous plaindre de tableaux à base zéro dans aucun langage de programmation. Ils fonctionnent exactement comme vous le souhaitez. (Mais, oui, les partisans des déplacements uniques et des réseaux sont des partisans et des fêtards. Les siècles devraient commencer sur XX00 ans et les millénaires sur X000 ans.)
Les calendriers sont stupides, mais au moins l'heure de la journée est à zéro
Chaque nouvelle minute de votre montre commence par: 00 secondes. Chaque nouvelle heure commence par 00:00 minutes et secondes. Et, au moins sur une horloge de 24 heures, le jour se termine lorsque minuit sonne et que 11:59:59 s’incrémente à 00:00:00.
Ainsi, si vous voulez calculer les secondes à partir de minuit pour une heure comme 13:53:04, il vous suffit d'évaluer 13 * 3600 + 53 * 60 + 4
. Pas d' 1
additions ni de soustractions insipides .
Clôture de clôture sur le MIDI
D'accord, qu'en est-il des musiciens, même supposés techniques?
MIDI! Il utilise la numérotation à base zéro pour les programmes et les canaux dans la représentation câblée des messages, mais Gear l’affiche sous la forme 1! Par exemple, les programmes 0 à 127 sont appelés 1 à 128 sur la plupart des engins, mais certains les appellent de 0 à 127 ou donnent même le choix à l'utilisateur.
Les programmes 71 à 80 sont considérés comme une "banque" de dix. C'est ce qui est écrit sur ma pédale MIDI, par exemple. Les commutateurs au pied sont étiquetés de 1 à 10 et, si je suis dans la septième banque, ils sélectionnent les programmes 71 à 80. Cependant, certains périphériques ou logiciels informatiques affichent les numéros de programme 1-128 de 0 à 127, voire donnent à l'utilisateur une choix! Qu'est-ce qui est pire: des systèmes à base unique ou le chaos créé en utilisant à la fois les systèmes un et zéro?
Les numéros de canal MIDI sont appelés de 1 à 16, mais sont représentés par 0 à 15 binaires. Comme par dépit pour la présentation à base unique, certains équipements utilisent un dispswitch pour configurer un numéro de canal et, souvent, ces commutateurs utilisent simplement le code binaire basé sur zéro. Donc, si vous voulez le canal 3, vous devez le basculer sur 0010 (binaire 2).