Підрахунок природно починається з нуля
Ось алгоритм підрахунку яблук у кошику:
count := 0
for each apple in basket
count := count + 1
Після виконання сказаного, count
тримається кількість яблук. Це може бути нуль, тому що кошики можуть бути порожніми.
Якщо ви не користуєтесь своєю кредитною карткою цілий місяць, чи отримуєте ви рахунок 1 долар? Або 1 цент?
Коли ви скидаєте лічильник руху на одометрі вашого автомобіля, він переходить до 0001 чи 0000?
Масиви можуть надавати кілька переглядів одних і тих же даних
Розглянемо масив з 32 бітових структур d
, кожний з яких складається з 16 бітових слів w
. Кожне слово складається з двох 8-бітових байтів b
. При нульовій індексації накладення виглядає дуже зручно:
d: | 0 | 1 |
w: | 0 | 1 | 2 | 3 |
b: |0|1|2|3|4|5|6|7|
32-бітний об'єкт, d[1]
як за адресою слова, w[2]
який легко обчислюється шляхом множення індексу на 2, що є співвідношенням розмірів об'єкта 32 та 16 біт. Крім того, у байт-адресації це так b[4]
.
Це працює тому, що в кожній одиниці вимірювання: байт, слово, подвійне слово тощо.
Подивіться на наведену вище схему: вона схожа на лінійку, де перетворення одиниць є інтуїтивно зрозумілим.
За допомогою однієї індексації на основі вона розбивається:
d: | 1 | 2 |
w: | 1 | 2 | 3 | 4 |
b: |1|2|3|4|5|6|7|8|
Тепер ми не можемо просто помножити d
індекс на 2, щоб отримати w
індекс, або на 4, щоб отримати b
індекс. Перетворення між одиницями стає незграбним. Наприклад, щоб перейти з d[2]
до b[4]
, ми повинні прорахувати ((2 - 1) * 4) + 1 = 5
.
Ми повинні відняти, що задирливий 1 зміщення в d
одиницях, потім зробіть масштабування в природній системі, що базується на нулях, а потім додамо назад нестабільний 1 в b
одиницях. Зауважте, що це не той самий 1! Віднімаємо одну подвійну ширину слова, але потім додаємо в одну байт ширину .
Перетворення між різними поглядами даних стає чимось на зразок перетворення Цельсія-Фаренгейта.
Ті, хто каже, що на основі масивів з однією базою легко розібратися на рівні реалізації, тому що є просто просте віднімання, що 1 обманюють себе, і ти. Це справедливо лише в тому випадку, якщо ми не проводимо будь-яких розрахунків масштабування між різними типами даних. Такі обчислення трапляються в будь-якій програмі, яка має гнучкий вигляд даних (наприклад, багатовимірний масив, який також доступний як одновимірний), або що маніпулює зберіганням: наприклад, розподільник пам'яті, файлова система або буферна бібліотека відеокадрів.
Мінімізація цифр
У будь-якій базі, якщо ми хочемо використовувати найменші цифри для реалізації діапазону значень, який є потужністю бази, ми повинні починати з нуля. Наприклад, у базовій частині десяти цифр достатньо, щоб дати нам тисячу різних значень від 0 до 999. Якщо ми починаємо з 1, ми переливаємось лише на одне значення, і нам потрібно чотири цифри.
Це важливо для комп'ютерів, оскільки кількість цифр у двійковій формі перекладається на апаратні рядки адреси. Наприклад, мікросхем ПЗУ, що містить 256 слів, може бути адресовано від 0 до 255, що вимагає 8 біт: 00000000 до 11111111. Якщо він адресований від 1 до 256, тоді потрібно дев'ять біт. Ми повинні марно додати ще одну траєкторію адреси до плати або інтегральної схеми. Отже, що, можливо, трапиться на практиці, це те, що 0 просто називатиметься1 на рівні програмного забезпечення для доступу до цього чіпа. Запит на слово 1 фактично поставить 00000000 на 8-бітну адресну шину. Або ж, запит 1 буде переводити на адресу 00000001, як і очікувалося, але запит на 256 відображалися б в іншому випадку невикористаної 8 бітний адреса 00000000 , а не 9 бітову адресу 100000000. Обидва цих мішків гризти кладжі дійсно рішення в пошук проблеми , і їх уникають повністю, послідовно використовуючи від 0 до 255 на апаратному забезпеченні, в програмному забезпеченні та в усіх користувальницьких інтерфейсах та документації.
Одномісні переміщення принципово дурні
Розглянемо, наприклад, західну теорію музики. У нас є діатонічні шкали із семи нотами, але ми називаємо простір, який вони охоплюють октавою ! Інверсія інтервалів слідує за правилом дев'яти : наприклад, інверсія третьої частини - шоста (віднімайте три з дев'яти). Отже, три різні числа грають для чогось такого простого: сім (ноти в масштабі), вісім (октава) і дев'ять (віднімання від до інвертування).
Якби сім нот складали септаву або гептаву, а інтервали були засновані на нулі, тоді ми віднімали б від семи до інвертування. Все на основі семи.
Крім того, інтервали можна легко складати. Якщо в поточній системі ми скачемо на п'яту, а потім на четверту, а потім на третю, ми не можемо просто їх додати. Отриманий інтервал на два менше. Це не дванадцята, а насправді десята! На кожному етапі ми повинні відняти один. Підйом на п'яту, а потім на четверту - це не дев'ята, а лише октава.
У здорово розробленій музичній системі ми могли просто додати інтервали, щоб визначити отримані стрибки. Послідовність приміток, яка починається і закінчується на одній ноті, тоді матиме властивість, аналогічну закону напруги навколо ланцюга: всі інтервали додавали б до нуля.
Теорія музики та письма погано застаріла. Більшість з них не змінилася з тих пір, коли складання було зроблено за допомогою ручки-перо запалом свічки.
Системи, що базуються на одній основі, плутають тих самих людей, які не можуть обробити масиви на нульовій основі
Коли 2000 рік прокотився, багато людей були розгублені, чому не почалося нове тисячоліття. Ті, хто вказує, що це не розпочнеться до 2001 року, розглядалися як мандрівники партії та опущення. Зрештою, вам 20 років, коли вам виповниться 20, правда? Не тоді, коли вам виповниться 21 рік. Якщо ви думали, що тисячоліття почалося 1 січня 2000 року, ви не маєте права скаржитися на нульові масиви будь-якою мовою програмування. Вони працюють, як саме вам подобається. (Але так, прихильники одноосновних переміщень та масивів - це опудала та партії-мандрівники. Століття повинні починатися з XX00 років, а тисячоліття - у X000 роках.)
Календарі німі, але принаймні час доби нульовий
Кожна нова хвилина на вашому годиннику починається з: 00 секунд. Кожна нова година починається з 00:00 хвилин і секунд. І, принаймні, на цілодобовому годиннику, день котиться, коли настає опівночі та з кроком 11:59:59 до 00:00:00.
Таким чином, якщо ви хочете обчислити секунди з півночі за такий час, як 13:53:04, вам доведеться просто оцінити 13 * 3600 + 53 * 60 + 4
. Ніяких нечітких 1
додавань чи віднімань.
Закриття про MIDI
Гаразд, що це з музикантами, навіть нібито технічними?
MIDI! Він використовує нульову нумерацію для програм і каналів у фактичному дротяному поданні повідомлень, але передач відображає його як 1 на основі! Наприклад, програми від 0 до 127 викликаються від 1 до 128 на більшості передач, але деякі викликають їх від 0 до 127 або навіть дають користувачеві можливість вибору.
Програми з 71 по 80 вважаються "банком" з десяти. Наприклад, це говорить прямо на моїй педалі MIDI. Перемикачі стоп позначаються від 1 до 10, і якщо я перебуваю в сьомому банку, вони вибирають програми від 71 до 80. Однак деякі пристрої або програмне забезпечення комп'ютера відображає номери програм 1-128 як 0 до 127, або навіть дає користувачеві вибір! Що гірше: системи, засновані на одній основі, або хаос, створений з використанням одночасно і одного, і нульового?
Номери каналів MIDI називаються від 1 до 16, але представлені 0 - 15 двійковими. Начебто, незважаючи на одноосновну презентацію, деяка передача використовує диспетчер для налаштування номера каналу, і часто перемикачі просто використовують двійковий код на основі нуля. Отже, якщо ви хочете канал 3, ви повинні переключити його на 0010 (двійковий 2).