Если вы спросите обычного человека: «Какое наибольшее число вы можете сосчитать руками?» подавляющее большинство, вероятно, сказали бы 10, ссылаясь на свои десять пальцев как на единицу, но что на самом деле означает 10? Почему мы пишем «один» и «ноль» рядом друг с другом, чтобы обозначить это количество? Чтобы понять десятичную систему, которую мы используем в повседневной жизни, ее происхождение и то, как она соотносится с нашим использованием данных и технологий, нам нужно ненадолго вернуться к началу, поэтому давайте начнем с унарной системы.

До широкого использования западно-арабских цифр во всем мире использовались и до сих пор используются многие другие системы счисления (например, 四十二、42 в Японии). Самым простым из них был счет по одному, без каких-либо специальных символов, обозначающих количество, или без указания больших групп чисел. Так что для счета «два» нужно было бы начертать ll, для счета «пять»: lllll и так далее.

Для повседневного использования эта система не обязательно плоха; однако все может быстро выйти из-под контроля, если вы хотите сделать что-нибудь математическое. Таким образом, по мере развития обществ по всему миру формировались различные системы счисления для облегчения всегда важной задачи счета. Например, римляне придали особый статус «пяти» и представили его как «V», сказать «четыре» означало сказать «один до пяти» или «IV» и так далее. Майя считали с помощью 20 специальных символов для своей математики и имели разные способы представления каждого из 20 чисел, один для реальной математики, а другой для художественного письма.

Я не буду углубляться в эту тему, так как это отвлечет внимание от этой статьи, но я оставлю вам, читатель, следующие 10 источников, чтобы удовлетворить ваше любопытство:

Список числовых чисел на протяжении всей истории: https://en.wikipedia.org/wiki/List_of_numeral_systems

Статья о причинах и истории числовых систем: https://betterexplained.com/articles/numbers-and-bases/

Основное увлечение, которое я хочу обсудить, заключается в том, почему мы используем нашу десятичную систему с точечной базой. С нашей системой мы можем создать любое бесконечно большое или малое число, используя только 9 уникальных символов и обозначение, указывающее показатель степени значения. Например, в школе мы узнали, что для выражения чисел мы сначала пишем наши единицы, затем наши десятки, затем наши сотни. Так что в нашей системе 111 означает «сто одиннадцать», а не «три». То, что происходит, так сказать, «за кулисами», заключается в том, что мы говорим нашей системе: «Хорошо, математика, у меня есть десять уникальных чисел, с которыми я хочу считать, но я хочу, чтобы они представляли экспоненциально большие числа, когда я перемещаю их позицию влево». Поэтому, когда мы говорим 10, это то же самое, что говорить: (1*10¹) + (0*10⁰). Когда мы говорим 404: (4*10²) + (0*10¹) + (4*10⁰).

Итак, теперь возникает 10 вопросов: что происходит, когда у нас есть более десяти уникальных символов для числа? и зачем нам нужна система счисления, которая делает это?

Закономерность, которую мы заметили выше, заключалась в том, что чем длиннее становилось число, тем показатель степени увеличивался на единицу. Таким образом, для любого заданного основания числовая последовательность для него будет выглядеть следующим образом: (символ * основание⁴) + (символ * основание³) + … и так далее, пока показатель степени не достигнет нуля. Таким образом, вместо 10 символов (0–9) скажем, у нас есть 13 (0-C, A представляет 10, B = 11 и C = 12). Как бы мы записали число 13 в этой системе? 10 или (1*13¹)+(0*13⁰). Написать 400? 24А или (2*13²) + (4*13¹) +(А*13⁰), 338 + 52 + 10.

Но как это связано с данными или почему это важно? Я ни в коем случае не являюсь экспертом по хранению данных, сжатию файлов или чему-то подобному, но мне нравится это представлять так: представьте на секунду, что у вас есть база данных и вы хотите хранить большое количество файлов, каждый со своим собственный уникальный идентификатор, начиная с 1 и считая вверх. Вы можете понять, почему в конце концов после достаточного количества записей мы столкнемся с аналогичной проблемой, с которой столкнулись наши предшественники, когда они считали по основанию 1. Поэтому, когда наша теоретическая база данных достигнет миллиона файлов, нам придется записать 1 000 00 в качестве идентификатора. Далее? 9 090 050 672 файла. Что, если вместо этого мы будем считать по основанию 16? Это превратит 1 000 000 в F4240 и 9 090 050 672 в 21DCF2A70. Гораздо аккуратнее не так ли?

Чтобы ответить на вопрос, который я задал в начале этого в значительной степени отвлекающего сообщения в блоге, мы можем сосчитать до 1023 с помощью наших десяти пальцев, если мы считаем по основанию 2, а не по основанию 1, поскольку наши пальцы могут представлять собой выступающую единицу. или свернутый 0, что дает нам: (2⁹+2⁸+2⁷+2⁶+2⁵+2⁴+2³+2²+2¹+2⁰) или сумму от n=0 до 9 из 2^n, когда все наши пальцы подняты .

Ради интереса я сделал следующие функции Javascript, которые будут переводить любое десятичное число в любое основание до 16 и возвращать его в виде строки, просто вызовите функцию и передайте ей сначала число, которое вы хотите перевести, а затем основание, которое вы хотите перевести в качестве параметров. Если вы хотите перевести в более высокие базы, просто добавьте больше букв в массив string_nums. Конечно, вы могли бы использовать parseInt… но что в этом интересного? :)

var string_nums = ["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"];
function recursiveReverse(str){
  if(str===''){
    return '';
  }
  return recursiveReverse(str.substr(1)) + str.charAt(0);
}
function decode_base(num, base){
  //divide by base, keep track of the remainder, add  string_nums[remainder] to a string, return string
  
  var rems = "";
  
  while(num > 0){
    var remainder = num%base;
    rems += string_nums[remainder];  
    num = Math.floor(num/base);
  }
  return recursiveReverse(rems);
}
//Example call below
decode_base(1337,16); //=> '539'

Надеюсь, вам понравилась запись!