Liczenie oczywiście zaczyna się od zera
Oto algorytm zliczania jabłek w koszyku:
count := 0
for each apple in basket
count := count + 1
Po wykonaniu powyższego count
posiada liczbę jabłek. Może to być zero, ponieważ kosze mogą być puste.
Jeśli nie korzystasz z karty kredytowej przez cały miesiąc, czy otrzymujesz rachunek w wysokości 1 dolara? Czy 1 cent?
Czy po zresetowaniu licznika podróży licznika kilometrów w samochodzie zmienia się on na 0001 lub 0000?
Tablice mogą zapewniać wiele widoków tych samych danych
Rozważ tablicę 32-bitowych struktur d
, z których każda składa się z 16-bitowych słów w
. Każde słowo składa się z dwóch 8 bitów b
. Przy indeksowaniu zerowym nakładka wygląda bardzo wygodnie:
d: | 0 | 1 |
w: | 0 | 1 | 2 | 3 |
b: |0|1|2|3|4|5|6|7|
Obiekt 32-bitowy d[1]
jak na adres słowa, w[2]
który można łatwo obliczyć, mnożąc indeks przez 2, co jest stosunkiem wielkości obiektu 32 i 16 bitów. Ponadto w adresowaniu bajtów tak jest b[4]
.
Działa to, ponieważ zero wynosi zero, w każdej jednostce miary: bajt, słowo, podwójne słowo i tak dalej.
Spójrz na powyższy diagram: wygląda jak linijka, gdzie konwersje jednostek są intuicyjne.
Dzięki indeksowaniu opartemu na jednym podziale:
d: | 1 | 2 |
w: | 1 | 2 | 3 | 4 |
b: |1|2|3|4|5|6|7|8|
Teraz nie możemy po prostu pomnożyć d
indeksu przez 2, aby uzyskać w
indeks, lub przez 4, aby uzyskać b
indeks. Konwersja między jednostkami staje się niezdarna. Na przykład, aby przejść od d[2]
do b[4]
, musimy obliczyć ((2 - 1) * 4) + 1 = 5
.
Musimy odjąć to brzydkie 1 odchylenie w d
jednostkach, następnie wykonać skalowanie w naturalnym układzie współrzędnych opartych na zerach, a następnie dodać nieznośny 1 w b
jednostkach. Pamiętaj, że to nie to samo 1! Odejmujemy szerokość jednego podwójnego słowa, ale dodajemy szerokość jednego bajtu .
Konwersja między różnymi widokami danych staje się czymś w rodzaju konwersji Celsjusza-Fahrenheita.
Ci, którzy twierdzą, że tablice oparte na jednym są łatwe do opanowania na poziomie implementacji, ponieważ wystarczy odjąć 1, oszukują samych siebie i ciebie. Jest to prawdą tylko wtedy, gdy nie wykonujemy żadnych obliczeń skalowania dla różnych typów danych. Takie obliczenia odbywają się w dowolnym programie, który ma elastyczny widok danych (np. Tablica wielowymiarowa, do której dostęp jest również dostępny jako jednowymiarowy) lub który manipuluje pamięcią: na przykład, alokator pamięci, system plików lub biblioteka buforów klatek wideo.
Minimalizacja cyfr
W dowolnej bazie, jeśli chcemy użyć jak najmniejszej liczby cyfr do zaimplementowania zakresu wartości, który jest potęgą bazy, musimy zacząć od zera. Na przykład w bazie dziesiętnej wystarczą trzy cyfry, aby dać nam tysiąc różnych wartości od 0 do 999. Jeśli zaczniemy od 1, przepełnimy tylko jedną wartością i potrzebujemy czterech cyfr.
Jest to ważne w komputerach, ponieważ liczba cyfr w systemie binarnym przekłada się na sprzętowe linie adresowe. Na przykład układ ROM z 256 słowami może być adresowany od 0 do 255, co wymaga 8 bitów: od 00000000 do 11111111. Jeśli adresowany jest od 1 do 256, potrzeba dziewięciu bitów. Musimy marnotrawnie dodać jeszcze jeden ślad adresu do płytki drukowanej lub układu scalonego. Tak więc, co mogłoby się zdarzyć w praktyce, byłoby wywołanie 01 na poziomie interfejsu API oprogramowania w celu uzyskania dostępu do tego układu. Prośba o słowo 1 faktycznie umieściłaby 00000000 na 8-bitowej magistrali adresowej. Inaczej żądanie 1 oznaczałoby translację na adres 00000001, zgodnie z oczekiwaniami, ale żądanie 256 odwzorowałoby raczej na nieużywany 8-bitowy adres 00000000 zamiast 9-bitowego adresu 100000000. Obie te kłębiące się klapki są naprawdę rozwiązaniem wyszukiwanie problemu i można go całkowicie uniknąć, konsekwentnie wykorzystując od 0 do 255 na sprzęcie, w oprogramowaniu oraz we wszystkich interfejsach użytkownika i dokumentacji.
Przesunięcia oparte na jednym są zasadniczo głupie
Weźmy na przykład zachodnią teorię muzyki. Mamy skale diatoniczne z siedmioma nutami, ale nazywamy przestrzeń, którą pokrywają oktawę ! Odwrócenie przedziałów następuje następnie według zasady dziewięciu : na przykład odwrócenie jednej trzeciej jest szóste (odejmij trzy od dziewięciu). Tak więc w grę wchodzą trzy różne liczby dla czegoś tak prostego: siedem (nuty w skali), osiem (oktawa) i dziewięć (odejmij od do inwertowanego).
Gdyby siedem nut tworzyło septawę lub heptawę, a interwały były oparte na zerach, wówczas odejmowalibyśmy od siedmiu do inwersji. Wszystko oparte na siódemce.
Ponadto odstępy mogą być łatwo układane w stosy. W obecnym systemie, jeśli przeskoczymy o jedną piątą, a następnie znowu o czwartą, a następnie o jedną trzecią, nie możemy po prostu dodać tych. Wynikowy interwał jest o dwa mniejszy. To nie jest dwunasty, ale w rzeczywistości dziesiąty! Na każdym etapie musimy odjąć jeden. Wzrost o jedną piątą, a następnie czwartą, nie jest dziewiątą, ale tylko oktawą.
W zdrowo zaprojektowanym systemie muzycznym moglibyśmy po prostu dodawać interwały, aby określić wynikowe skoki. Sekwencja nut, która zaczyna się i kończy na tej samej nucie, miałaby wówczas właściwość podobną do prawa napięcia wokół obwodu: wszystkie przedziały zwiększyłyby się do zera.
Teoria muzyki i pisanie są mocno przestarzałe. Większość nie zmieniła się, odkąd komponowanie dni odbywało się za pomocą piór z piórem przy świetle świecy.
Systemy oparte na jednym pomieszają te same osoby, które nie radzą sobie z tablicami zerowymi
Gdy minął rok 2000, wielu ludzi było zdezorientowanych, dlaczego nowe tysiąclecie się nie rozpoczęło. Ci, którzy podkreślają, że nie rozpocznie się przed 2001 rokiem, byli uważani za kupców i dweebów. W końcu masz 20 lat, kiedy skończysz 20 lat, prawda? Nie kiedy skończysz 21 lat. Jeśli uważasz, że tysiąclecie rozpoczęło się 1 stycznia 2000 r., Nie masz prawa narzekać na tablice zerowe w dowolnym języku programowania. Działają dokładnie tak, jak lubisz. (Ale tak, zwolennicy przemieszczeń i tablic opartych na jednostkach to dweeby i kupa na imprezę. Stulecia powinny zacząć się w XX00 lat, a tysiąclecia w X000).
Kalendarze są głupie, ale przynajmniej pora dnia zależy od zera
Każda nowa minuta na zegarku zaczyna się od: 00 sekund. Każda nowa godzina zaczyna się od 00:00 minut i sekund. I, przynajmniej na 24-godzinnym zegarze, dzień mija, gdy wybija północ i przyrosty 11:59:59 do 00:00:00.
Dlatego jeśli chcesz obliczyć sekundy od północy dla czasu takiego jak 13:53:04, musisz tylko ocenić 13 * 3600 + 53 * 60 + 4
. Bez mdłych 1
dodatków i odejmowań.
Zakończenie na temat MIDI
Okej, o co chodzi z muzykami, nawet podobno technicznymi?
MIDI! Używa numeracji od zera dla programów i kanałów w rzeczywistym przewodowym przedstawieniu wiadomości, ale sprzęt wyświetla ją jako 1! Na przykład programy od 0 do 127 są wywoływane od 1 do 128 na większości urządzeń, ale niektóre nazywają je od 0 do 127 lub nawet dają użytkownikowi wybór.
Programy od 71 do 80 są uważane za „bank” dziesięciu. Tak mówi na przykład mój pedał MIDI. Przełączniki nożne są oznaczone od 1 do 10, a jeśli jestem w siódmym banku, wybierają programy od 71 do 80. Jednak niektóre urządzenia lub oprogramowanie komputerowe wyświetlają numery programów od 1 do 128 jako od 0 do 127, a nawet dają użytkownikowi wybór! Co jest gorsze: systemy oparte na jednym lub chaos powstały w wyniku jednoczesnego użycia zarówno jednego, jak i zera?
Numery kanałów MIDI są nazywane od 1 do 16, ale są reprezentowane przez 0 do 15 liczb binarnych. Jak na przekór prezentacji opartej na jednym urządzeniu, niektóre urządzenia używają przełącznika dyspozytorskiego do konfigurowania numeru kanału i często te przełączniki używają po prostu kodu binarnego opartego na zerach. Więc jeśli chcesz kanał 3, musisz przełączyć go na 0010 (binarny 2).