자연스럽게 계산은 0에서 시작합니다
바구니에 사과를 세는 알고리즘은 다음과 같습니다.
count := 0
for each apple in basket
count := count + 1
위의 실행 후 count
사과 수를 보유합니다. 바구니가 비어있을 수 있으므로 0 일 수 있습니다.
한 달 동안 신용 카드를 사용하지 않으면 1 달러의 청구서가 있습니까? 아니면 1 센트?
자동차 주행 거리계에서 트립 미터를 재설정하면 0001 또는 0000으로 이동합니까?
배열은 동일한 데이터에 대한 여러 뷰를 제공 할 수 있습니다
d
각각 16 비트 워드로 구성된 32 비트 구조의 배열을 고려하십시오 w
. 각 워드는 2 개의 8 비트 바이트로 구성 b
됩니다. 제로 인덱싱에서 오버레이는 매우 편리하게 보입니다.
d: | 0 | 1 |
w: | 0 | 1 | 2 | 3 |
b: |0|1|2|3|4|5|6|7|
32 비트 객체 d[1]
워드 주소로서 w[2]
용이 32, 16 비트의 객체의 크기의 비율을 2로 인덱스를 곱하여 계산된다. 또한 바이트 주소 지정에서는입니다 b[4]
.
바이트, 워드, 더블 워드 등 모든 측정 단위에서 0이 0이기 때문에 작동합니다.
위의 다이어그램을보십시오. 단위 변환이 직관적 인 눈금자와 매우 유사합니다.
하나의 기반 인덱싱으로 다음이 깨집니다.
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
.
d
단위 에서 성가신 1 바이어스를 빼고 자연 0 기반 좌표계에서 스케일링을 한 다음 성가신 1을 b
단위로 다시 추가해야합니다 . 동일하지 않습니다 1! 우리는 하나의 더블 워드 너비를 빼고 1 바이트 너비를 더 합니다.
데이터의 다른 뷰 간 변환은 섭씨-화씨 변환과 유사합니다.
1 기반 배열은 구현 수준에서 다루기가 쉽다고 말하는 사람들은 1을 간단히 빼면 스스로를 속이고 있기 때문입니다. 다른 데이터 유형간에 스케일링 계산을 수행하지 않는 경우에만 해당됩니다. 이러한 계산은 데이터에 대한 유연한 관점 (예 : 1 차원 배열로 액세스되는 다차원 배열)이 있거나 메모리 할당 자, 파일 시스템 또는 비디오 프레임 버퍼 라이브러리와 같은 스토리지를 조작하는 모든 프로그램에서 발생합니다.
자릿수 최소화
어떤 기초에서든, 가장 작은 자릿수를 사용하여 밑의 거듭 제곱 인 값의 범위를 구현하려면 0부터 시작해야합니다. 예를 들어 10 진법에서는 3 자리 숫자만으로도 0에서 999 사이의 천개의 고유 한 값을 얻을 수 있습니다. 1에서 시작하면 하나의 값만 넘치므로 4 자리 숫자가 필요합니다.
이진수의 자릿수가 하드웨어 주소 줄로 변환되므로 컴퓨터에서 중요합니다. 예를 들어 256 워드가 포함 된 ROM 칩은 0에서 255까지 주소 지정할 수 있으며 00000000에서 11111111까지 8 비트가 필요합니다. 1에서 256까지 주소가 지정된 경우 9 비트가 필요합니다. 회로 보드 나 집적 회로에 하나 이상의 주소 추적을 낭비 적으로 추가해야합니다. 실제로 실제로 일어날 수있는 일은 0이 호출 될 것입니다.해당 칩에 액세스하기위한 소프트웨어 API 레벨에서 1입니다. 워드 1에 대한 요청은 실제로 8 비트 주소 버스에 00000000을 넣습니다. 아니면, 일에 대한 요청은 예상대로 00000001를 해결하기 위해 번역,하지만 256에 대한 요청이 달리 사용되지 않는 8 비트 주소 00000000보다는 9 비트 주소 100000000이 가방 물어 뜯는 잡든지 모두를지도 할 것은 정말 의 솔루션 하드웨어, 소프트웨어 및 모든 사용자 인터페이스 및 문서에서 0에서 255까지 일관되게 사용 하면 문제를 검색 할 수 있습니다.
1 기반 변위는 기본적으로 바보입니다
예를 들어 서양 음악 이론을 고려하십시오. 우리는 7 개의 음표로 된 음계 비늘을 가지고 있지만 옥타브 를 덮는 공간이라고 부릅니다 ! 그런 다음 구간의 반전은 9 의 규칙을 따릅니다 . 예를 들어 1/3의 반전은 6 분의 1입니다 (9에서 3을 뺍니다). 따라서 세 가지 숫자 (7 개 (음표 단위), 8 개 (옥타브) 및 9 개 (거꾸로 빼기))가 매우 간단한 것입니다.
7 개의 음표가 9 중음 또는 헵 타브를 만들었고 간격이 0을 기준으로 한 경우 7에서 빼기 위해 거꾸로합니다. 7에 기초한 모든 것.
또한 간격을 쉽게 쌓을 수 있습니다. 현재 시스템에서, 우리가 5 분의 1, 4 분의 1, 3 분의 1로 다시 도약한다면, 우리는 이것들을 추가 할 수 없습니다. 결과 간격이 2 줄어 듭니다. 그것은 열두 번째가 아니라 실제로 열 번째입니다! 각 단계에서 하나를 빼야합니다. 다섯 번째로 올라간 다음 네 번째로 올라가는 것은 아홉 번째가 아니라 한 옥타브입니다.
깔끔하게 설계된 음악 시스템에서는 간격을 추가하여 결과적으로 도약 할 수 있습니다. 동일한 노트에서 시작하고 끝나는 일련의 노트는 회로 주변의 전압 법칙과 유사한 특성을 갖습니다. 모든 간격은 0에 추가됩니다.
음악 이론과 작문은 구식입니다. 촛불의 빛으로 퀼 펜으로 작곡을 한 날부터 대부분의 변화가 없었습니다.
1 기반 시스템은 제로 기반 배열을 처리 할 수없는 사람과 혼동
2000 년이 무너지자 많은 사람들이 왜 새 천년이 시작되지 않은지 혼란 스러웠습니다. 2001 년까지는 시작되지 않을 것이라고 지적한 사람들은 정당 똥꾼과 족제비로 간주되었습니다. 결국, 당신은 20 세가되면 20 대가되었습니다. 밀레니엄이 2000 년 1 월 1 일에 시작되었다고 생각했다면, 어떤 프로그래밍 언어로든 0부터 시작하는 배열에 대해 불평 할 권리가 없습니다. 그들은 당신이 얼마나 좋아하는지 정확히 작동합니다. (그렇지만, 1 기반 변위와 배열의 지지자들은 족집게와 파티 푸퍼입니다. 세기는 XX00 년에 시작해야하며, 천 년은 X000 년에 시작해야합니다.)
캘린더는 멍청하지만 적어도 하루 중 시간은 0을 기준으로합니다.
시계의 새로운 1 분마다 : 00 초로 시작합니다. 각각의 새로운 시간은 00:00 분과 초로 시작합니다. 그리고 적어도 24 시간 제로 자정이되면 낮이 돌아 다니며 11:59:59는 00:00:00으로 증가합니다.
따라서 13:53:04와 같은 시간 동안 자정부터 초를 계산하려면을 평가하면됩니다 13 * 3600 + 53 * 60 + 4
. 어리석은 1
덧셈이나 뺄셈이 없습니다.
MIDI에 대한 닫는 소리
좋아, 아마도 음악가들, 아마도 기술적 인 사람들은 무엇입니까?
미디! 메시지의 실제 와이어 표현에서 프로그램과 채널에 0부터 시작하는 번호 매기기를 사용하지만 gear는 1부터 시작하는 것으로 표시합니다! 예를 들어 프로그램 0에서 127까지는 대부분의 기어에서 1에서 128까지 호출되지만 일부는 0에서 127까지 호출하거나 사용자에게 선택을 제공합니다.
프로그램 71부터 80까지는 "은행"으로 간주됩니다. 예를 들어 MIDI 페달에 바로 표시됩니다. 풋 스위치는 1에서 10까지 레이블이 붙어 있으며 7 번째 뱅크에있는 경우 프로그램 71에서 80을 선택합니다. 그러나 일부 장치 또는 컴퓨터 소프트웨어는 1-128 프로그램 번호를 0에서 127로 표시하거나 사용자에게 선택! 더 나쁜 점은 1 기반 시스템 또는 1과 0을 동시에 사용하여 만든 혼란입니까?
MIDI 채널 번호는 1 ~ 16이지만 0 ~ 15 이진수로 표시됩니다. 1 기반 프레젠테이션에도 불구하고 일부 기어는 채널 번호 구성을 위해 dispswitch를 사용하며 종종 스위치는 0 기반 이진 코드를 사용합니다. 따라서 채널 3을 원하면 0010 (이진 2)으로 전환해야합니다.