A contagem começa naturalmente em zero
Aqui está o algoritmo para contar maçãs em uma cesta:
count := 0
for each apple in basket
count := count + 1
Após a execução do acima, count
mantém o número de maçãs. Pode ser zero, porque as cestas podem estar vazias.
Se você não usar seu cartão de crédito por um mês inteiro, receberá uma nota de 1 dólar? Ou 1 centavo?
Quando você redefine o medidor de viagem no odômetro do seu carro, ele passa para 0001 ou 0000?
As matrizes podem fornecer várias visualizações dos mesmos dados
Considere uma matriz de estruturas de 32 bits d
, cada uma composta por palavras de 16 bits w
. Cada palavra é composta de dois bytes de 8 bits b
. Sob indexação zero, a sobreposição parece muito conveniente:
d: | 0 | 1 |
w: | 0 | 1 | 2 | 3 |
b: |0|1|2|3|4|5|6|7|
O objeto de 32 bits, d[1]
como no endereço da palavra, w[2]
é facilmente calculado multiplicando o índice por 2, que é a proporção dos tamanhos do objeto de 32 e 16 bits. Além disso, no endereçamento de bytes, é b[4]
.
Isso funciona porque zero é zero, em todas as unidades de medida: byte, palavra, palavra dupla e assim por diante.
Veja o diagrama acima: ele se parece muito com uma régua, onde as conversões de unidades são intuitivas.
Com uma indexação baseada, ele quebra:
d: | 1 | 2 |
w: | 1 | 2 | 3 | 4 |
b: |1|2|3|4|5|6|7|8|
Agora não podemos simplesmente multiplicar o d
índice por 2 para obter o w
índice ou por 4 para obter o b
índice. A conversão entre unidades se torna desajeitada. Por exemplo, para ir de d[2]
para b[4]
, temos que calcular ((2 - 1) * 4) + 1 = 5
.
Temos que subtrair esse viés traquinas 1 nas d
unidades, fazer o dimensionamento no sistema de coordenadas natural baseado em zero e, em seguida, adicionar novamente o traquinas 1 em b
unidades. Observe que não é o mesmo 1! Subtraímos uma largura de palavra dupla, mas adicionamos uma largura de byte .
A conversão entre diferentes visões dos dados se torna algo como a conversão Celsius-Fahrenheit.
Aqueles que dizem que matrizes de base única são fáceis de lidar no nível de implementação, porque há apenas uma subtração simples de 1, estão enganando a si mesmos e a você. Isso é verdade apenas se não fizermos cálculos de dimensionamento entre diferentes tipos de dados. Tais cálculos ocorrem em qualquer programa que tenha uma visão flexível dos dados (por exemplo, um array multidimensional também acessado como um unidimensional) ou que manipule o armazenamento: por exemplo, um alocador de memória, sistema de arquivos ou biblioteca de buffer de quadro de vídeo.
Minimizando dígitos
Em qualquer base, se quisermos usar o menor número de dígitos para implementar um intervalo de valores que é uma potência da base, devemos começar do zero. Por exemplo, na base dez, três dígitos são suficientes para fornecer mil valores distintos de 0 a 999. Se começarmos de 1, excederemos apenas um valor e precisaremos de quatro dígitos.
Isso é importante em computadores, porque o número de dígitos no binário se traduz em linhas de endereço de hardware. Por exemplo, um chip ROM com 256 palavras pode ser endereçado de 0 a 255, o que requer 8 bits: 00000000 a 11111111. Se for endereçado de 1 a 256, serão necessários nove bits. Temos que adicionar desnecessariamente mais um rastreio de endereço à placa de circuito ou ao circuito integrado. Então, o que possivelmente aconteceria na prática seria que 0 seria chamado1 no nível da API do software para acessar esse chip. Uma solicitação para a palavra 1 realmente colocaria 00000000 no barramento de endereço de 8 bits. Ou então, um pedido de 1 se traduziria em endereço 00000001, como esperado, mas um pedido de 256 iria mapear para o endereço de 8 bits de outra forma não utilizado 00000000 em vez do endereço 100000000. Ambos os kludges-mordendo saco de 9 bits são realmente soluções em pesquisa de um problema e são evitados inteiramente usando 0 a 255 consistentemente no hardware, no software e em todas as interfaces e documentação do usuário.
Deslocamentos de base única são fundamentalmente estúpidos
Considere a teoria musical ocidental, por exemplo. Temos escalas diatônicas com sete notas, mas chamamos o espaço que elas cobrem uma oitava ! A inversão de intervalos segue a regra dos nove : por exemplo, a inversão de um terço é um sexto (subtrai três de nove). Então, três números diferentes estão em jogo para algo tão simples: sete (notas em uma escala), oito (oitava) e nove (subtrair de para inverter).
Se sete notas fizessem uma oitava ou hepta e os intervalos fossem baseados em zero, subtraímos de sete para inverter. Tudo baseado em sete.
Além disso, os intervalos podem ser facilmente empilhados. No sistema atual, se saltamos um quinto e depois um quarto novamente, e depois um terço, não podemos apenas adicioná-los. O intervalo resultante é dois a menos. Não é um décimo segundo, mas na verdade um décimo! Em cada estágio, temos que subtrair um. Subir um quinto e depois um quarto não é o nono, mas apenas uma oitava.
Em um sistema de música projetado de maneira saudável, podemos adicionar intervalos para determinar os saltos resultantes. Uma sequência de notas que começa e termina na mesma nota teria então uma propriedade semelhante à lei de tensão em torno de um circuito: todos os intervalos seriam adicionados a zero.
A teoria musical e a escrita estão desatualizadas. A maior parte não mudou desde os dias em que a composição era feita com canetas de pena à luz de uma vela.
Os sistemas de base única confundem as mesmas pessoas que não conseguem lidar com matrizes de base zero
Quando o ano de 2000 chegou, muitas pessoas ficaram confusas por que o novo milênio não começou. Aqueles que afirmam que não começará antes de 2001 foram considerados cocô e babacas. Afinal, você está na casa dos 20 quando faz 20 anos, certo? Não quando você completa 21 anos. Se você pensou que o milênio começou em 1º de janeiro de 2000, não tem o direito de reclamar de matrizes baseadas em zero em qualquer linguagem de programação. Eles funcionam exatamente como você gosta. (Mas, sim, os defensores de deslocamentos e matrizes baseados em uma só pessoa são bobos e cocô de festas. Os séculos devem começar nos anos XX00 e milênios nos anos X000.)
Os calendários são burros, mas pelo menos a hora do dia é baseada em zero
Cada novo minuto no seu relógio começa com: 00 segundos. Cada nova hora começa com 00:00 minutos e segundos. E, pelo menos em um relógio de 24 horas, o dia passa quando a meia-noite ocorre e 11:59:59 aumenta para 00:00:00.
Portanto, se você deseja calcular segundos a partir da meia-noite para um horário como 13:53:04, basta avaliar 13 * 3600 + 53 * 60 + 4
. Nenhuma 1
adição ou subtração insípida .
Discurso de encerramento sobre MIDI
Ok, o que há com músicos, mesmo supostamente técnicos?
MIDI! Ele usa numeração com base em zero para programas e canais na representação real de mensagens, mas a engrenagem exibe como 1! Por exemplo, os programas de 0 a 127 são chamados de 1 a 128 na maioria dos equipamentos, mas alguns os chamam de 0 a 127 ou até oferecem ao usuário uma escolha.
Os programas 71 a 80 são considerados um "banco" de dez. É o que diz no meu pedal MIDI, por exemplo. Os pedais são rotulados de 1 a 10 e, se eu estiver no sétimo banco, eles escolhem os programas 71 a 80. No entanto, alguns dispositivos ou software de computador exibem os números de programas 1-128 como 0 a 127, ou até dão ao usuário uma escolha! O que é pior: sistemas baseados em um ou caos criado usando um e zero ao mesmo tempo?
Os números dos canais MIDI são chamados de 1 a 16, mas são representados por 0 a 15 binários. Como se não fosse a apresentação baseada em um, alguns equipamentos usam um dispswitch para configurar um número de canal e, freqüentemente, esses comutadores usam apenas o código binário baseado em zero. Portanto, se você deseja o canal 3, deve alterná-lo para 0010 (binário 2).