Natürlich beginnt das Zählen bei Null
Hier ist der Algorithmus zum Zählen von Äpfeln in einem Korb:
count := 0
for each apple in basket
count := count + 1
Nach der Ausführung des oben genannten, count
hält die Anzahl der Äpfel. Es kann Null sein, weil Körbe leer sein können.
Wenn Sie Ihre Kreditkarte einen Monat lang nicht benutzen, erhalten Sie eine Rechnung über 1 Dollar? Oder 1 Cent?
Wenn Sie den Kilometerzähler Ihres Autos zurücksetzen, wechselt er zu 0001 oder 0000?
Arrays können mehrere Ansichten derselben Daten bereitstellen
Betrachten Sie ein Array von 32-Bit-Strukturen d
, die jeweils aus 16-Bit-Wörtern bestehen w
. Jedes Wort besteht aus zwei 8-Bit-Bytes b
. Bei einer Indizierung von Null sieht die Überlagerung sehr praktisch aus:
d: | 0 | 1 |
w: | 0 | 1 | 2 | 3 |
b: |0|1|2|3|4|5|6|7|
Das 32-Bit-Objekt entspricht d[1]
der Wortadresse, w[2]
die leicht berechnet werden kann, indem der Index mit 2 multipliziert wird. Dies ist das Verhältnis der Größe des 32- und 16-Bit-Objekts. Außerdem ist es bei der Byteadressierung b[4]
.
Dies funktioniert, weil Null in jeder Maßeinheit Null ist: Byte, Wort, Doppelwort und so weiter.
Schauen Sie sich das obige Diagramm an: Es ähnelt einem Lineal, bei dem die Umrechnung von Einheiten intuitiv ist.
Bei einer einbasierten Indizierung wird Folgendes aufgehoben:
d: | 1 | 2 |
w: | 1 | 2 | 3 | 4 |
b: |1|2|3|4|5|6|7|8|
Jetzt können wir den d
Index nicht einfach mit 2 multiplizieren , um den w
Index zu erhalten, oder mit 4, um den b
Index zu erhalten. Die Umrechnung zwischen Einheiten wird umständlich. Zum Beispiel aus gehen d[2]
zu b[4]
müssen wir berechnen ((2 - 1) * 4) + 1 = 5
.
Wir müssen diese lästige 1-Verzerrung in den d
Einheiten subtrahieren , dann die Skalierung im natürlichen Koordinatensystem auf Nullbasis durchführen und dann die lästige 1 in b
Einheiten zurückaddieren . Beachten Sie, dass es nicht dasselbe ist 1! Wir subtrahieren eine doppelte Wortbreite, addieren dann aber eine Bytebreite hinzu .
Das Konvertieren zwischen verschiedenen Ansichten der Daten wird zu einer Art Celsius-Fahrenheit-Konvertierung.
Diejenigen, die sagen, dass einbasierte Arrays auf Implementierungsebene leicht zu handhaben sind, weil es nur eine einfache Subtraktion von 1 gibt, täuschen sich selbst und Sie. Dies gilt nur, wenn keine Skalierungsberechnungen für verschiedene Datentypen durchgeführt werden. Solche Berechnungen finden in jedem Programm statt, das eine flexible Sicht auf Daten hat (z. B. ein mehrdimensionales Array, auf das auch eindimensional zugegriffen wird) oder das den Speicher manipuliert, z.
Ziffern minimieren
Wenn wir in einer Basis die wenigsten Stellen verwenden möchten, um einen Wertebereich zu implementieren, der eine Potenz der Basis ist, müssen wir bei Null beginnen. In der Basis 10 reichen beispielsweise drei Ziffern aus, um uns tausend verschiedene Werte von 0 bis 999 zu geben. Wenn wir bei 1 beginnen, überlaufen wir nur um einen Wert, und wir benötigen vier Ziffern.
Dies ist bei Computern wichtig, da die Anzahl der Ziffern in Binärdateien in Hardware-Adresszeilen umgewandelt wird. Zum Beispiel kann ein ROM-Chip mit 256 Wörtern von 0 bis 255 adressiert werden, was 8 Bits erfordert: 00000000 bis 11111111. Wenn er von 1 bis 256 adressiert wird, werden neun Bits benötigt. Wir müssen der Leiterplatte oder der integrierten Schaltung verschwenderisch eine weitere Adressenspur hinzufügen. Was also in der Praxis möglicherweise passieren würde, wäre, dass 0 nur aufgerufen würde1 auf der Software-API-Ebene für den Zugriff auf diesen Chip. Eine Anforderung für Wort 1 würde tatsächlich 00000000 auf den 8-Bit-Adressbus setzen. Oder aber, eine Anfrage für 1 würde übersetzen 00000001 Adresse, wie erwartet, aber ein Antrag auf 256 würde Karte auf die sonst ungenutzt 8 - Bit - Adressen 00000000 statt der 9 - Bit - Adresse 100000000 Beide sack beißenden kludges sind wirklich Lösungen in Suche nach einem Problem und werden vollständig vermieden, indem konsequent 0 bis 255 auf der Hardware, in der Software und in allen Benutzeroberflächen und in der Dokumentation verwendet werden.
Einbasige Verschiebungen sind grundsätzlich dumm
Betrachten wir zum Beispiel die westliche Musiktheorie. Wir haben diatonische Skalen mit sieben Tönen, aber wir nennen den Raum, den sie eine Oktave bedecken ! Die Umkehrung der Intervalle folgt dann der Regel von neun : Beispielsweise ist die Umkehrung einer dritten eine sechste (subtrahiere drei von neun). Für so etwas Einfaches spielen also drei verschiedene Zahlen eine Rolle: Sieben (Noten auf einer Skala), Acht (Oktave) und Neun (Subtrahieren von zu Invertieren).
Wenn sieben Noten eine Septave oder Heptave bilden und die Intervalle auf Null basieren, würden wir von sieben zu invertieren subtrahieren. Alles basierend auf sieben.
Außerdem könnten Intervalle leicht gestapelt werden. Wenn wir im gegenwärtigen System um ein Fünftel und dann um ein Viertes und dann um ein Drittes springen, können wir diese nicht einfach addieren. Das resultierende Intervall ist zwei weniger. Es ist nicht ein Zwölfter, sondern ein Zehntel! In jeder Phase müssen wir eine Eins abziehen. Eine fünfte und eine vierte Stufe höher zu legen, ist keine neunte, sondern nur eine Oktave.
In einem vernünftig gestalteten Musiksystem könnten wir einfach Intervalle hinzufügen, um die resultierenden Sprünge zu bestimmen. Eine Folge von Noten, die mit derselben Note beginnt und endet, hätte dann eine ähnliche Eigenschaft wie das Spannungsgesetz um einen Stromkreis: Alle Intervalle addieren sich zu Null.
Musiktheorie und Schrift sind stark veraltet. Das meiste hat sich nicht geändert, seitdem das Komponieren mit Federkielen im Licht einer Kerze erfolgte.
Einbasierte Systeme verwirren dieselben Personen, die mit nullbasierten Arrays nicht umgehen können
Als das Jahr 2000 herumlief, waren viele Menschen verwirrt, warum das neue Jahrtausend noch nicht begonnen hat. Diejenigen, die darauf hinwiesen, dass es erst 2001 beginnen wird, galten als Parteikacke und Dweebs. Immerhin sind Sie in den Zwanzigern, wenn Sie 20 werden, richtig? Nicht, wenn Sie 21 werden. Wenn Sie dachten, dass das Jahrtausend am 1. Januar 2000 begann, haben Sie in keiner Programmiersprache das Recht, sich über nullbasierte Arrays zu beschweren. Sie arbeiten, wie genau Sie möchten. (Aber ja, Befürworter von einseitigen Verschiebungen und Arrays sind Dweebs und Party-Poopers. Jahrhunderte sollten in den 20er und Jahrtausenden in den X000 Jahren beginnen.)
Kalender sind dumm, aber zumindest die Tageszeit basiert auf Null
Jede neue Minute Ihrer Uhr beginnt mit: 00 Sekunden. Jede neue Stunde beginnt mit 00:00 Minuten und Sekunden. Zumindest im 24-Stunden-Format dreht sich der Tag, wenn Mitternacht schlägt, und steigt von 11:59:59 auf 00:00:00.
Wenn Sie also Sekunden ab Mitternacht für eine Zeit wie 13:53:04 berechnen möchten, müssen Sie nur auswerten 13 * 3600 + 53 * 60 + 4
. Keine fetten 1
Hinzufügungen oder Subtraktionen.
Schlussrede über MIDI
Okay, was ist mit Musikern, auch mit vermeintlich technischen?
MIDI! Es wird eine auf Null basierende Nummerierung für Programme und Kanäle in der tatsächlichen Drahtdarstellung von Nachrichten verwendet, aber das Zahnrad zeigt sie als 1-basiert an! Zum Beispiel werden die Programme 0 bis 127 bei den meisten Gängen als 1 bis 128 bezeichnet, aber einige nennen sie 0 bis 127 oder geben dem Benutzer sogar eine Wahlmöglichkeit.
Die Programme 71 bis 80 gelten als "Bank" von zehn. So steht es zum Beispiel direkt auf meinem MIDI-Pedal. Die Fußschalter sind mit 1 bis 10 beschriftet und wenn ich in der siebten Bank bin, wählen sie die Programme 71 bis 80 aus. Einige Geräte oder Computersoftware zeigen die 1-128-Programmnummern jedoch als 0 bis 127 an oder geben dem Benutzer sogar eine Wahl! Was ist schlimmer: Einbasierte Systeme oder Chaos, das durch die gleichzeitige Verwendung von Eins und Null erzeugt wird?
MIDI-Kanalnummern werden als 1 bis 16 bezeichnet, aber durch 0 bis 15 binär dargestellt. Wie aus Versehen für die einseitige Darstellung verwenden einige Geräte einen Dispenser zum Konfigurieren einer Kanalnummer, und häufig verwenden diese Schalter nur den nullbasierten Binärcode. Wenn Sie also Kanal 3 möchten, müssen Sie ihn auf 0010 (Binär 2) umschalten.