[hackeroid] B1:2 Системы счисления

В большинстве стран мира, не смотря на разные языки, считают по одинаковому, "по-арабски", используя десять цифр (digit), 0123456789. Когда доходят до последней цифры, используют двухзначные числа (number). Если бы у нас было только пять цифр, 01234, мы бы считали так: 0 1 2 3 4 10 11 12 13 14 20 21 22 23 24 30 31 32 33 34 40 41 42 43 44 100 101 102 103 104 110 111 112...

Обычную систему счисления называют десятичной (decimal, сокращенно dec). Ту, которую мы только что рассмотрели -- пятеричной. Система счисления по английски -- number system. Число цифр в системе счисления -- основание системы счисления (base, иногда radix).

При основании системы больше десяти приходится вводить новые цифры. В качестве них принято использовать латинские буквы (alpha). Так, в семнадцатеричной системе счисления мы бы считали 0 1 2 3 4 5 6 7 8 9 A B C D E F G 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 1G 20.. GD GE GF GG 100 101 102.. При достаточно большом основании (при каком?) этот номер не пройдет.

Разные системы счисления -- как разные языки. У одного и того же числа могут быть совершенно разные записи в разных системах счисления. Так, число 127 в десятичной равно 7F в шестнадцатеричной и 1111111 в двоичной. Точно также, как слова переводят с одного языка на другой, числа можно переводить из одной системы счисления в другую. Эти системы счисления -- нечто вроде компьютерного языка для чисел. Двоичная (binary, сокращенно bin) система счисления используется практически на всех машинах. В добавок к ней на машинах PDP-11, БК-0010, ДВК используются восьмеричная система счисления (octal, сокращенно oct). На машинах IBM PC, Macintosh, VAX вместо восьмеричной используется шестнадцатеричная (hexadecimal, сокращенно hex) система счисления.

Разумеется, нули перед числом не изменяют его значение ни в какой из систем счисления. Очень хорошо, если вы будете представлять себе, что перед каждым числом как бы написано бесконечное количество нулей -- это вам очень пригодится в начале второй БАЗЫ (B2:1).

Очень советую посчитать немного в различных системах счисления. Если вы возьмете листочек в клеточку и пронумеруете строчки сначала в десятичной системе счисления, потом в восьмеричной, шестнадцатеричной и двоичной, вы получите неплохую табличку перевода первых тридцати с небольшим чисел между наиболее используемыми в хэкерстве системами счисления. Напишите на этой таблице также числовые значения всех латинских букв -- вам это сильно пригодится в дальнейшем.

Таблицу перевода первых 16 чисел между двоичной, десятичной и шестнадцатеричной системами счисления в нашей Школе называют таблицей Дракона (B1:5).

>>>

Конкретный рисунок цифр неважен. То, что ноль обозначается кружочком, а единица -- палочкой, всего лишь историческая условность. Мы можем нормально считать в троичной системе счисления с цифрами %$^: % $ ^ $% $$ $^ ^% ^$ ^^ $%% $%$ $%^ $$% $$$ $$^ $^% $^$ $^^ ^%%... А система счисления, где вместо цифр используются русские буквы, очень перспективна в компьютерном мире -- ведь русских букв (если не считать буквы Е "с двумя точками") всего 32, а это степень двойки!

Точно также не стоит воспринимать всерьез требования использовать латинские буквы после девятки. ASCII-символы, стоящие после девятки, к примеру, ничем не хуже. Разве что меньше людей будут вас понимать. (Не советую этим прикрывать свою лень сделать нормальный вывод 16-ричных чисел. Запутаетесь при анализе вывода.)

По настоящему для указания системы счисления надо указывать не ее основание, а вектор (упорядоченный массив) ее цифр. Считая в системах счисления с вектором основания, в котором цифры идут "не по порядку" (например, восьмеричная система с вектором 31276504), можно существенно затруднить понимание происходящего.

На семинаре нашей Школе "Взлом игрушек без отладчика" я рассказывал про взлом игрового картриджа Ecco the Dolphin для телевизионной приставки SEGA. Эта игра заключалась в квестовом путешествии дельфинчика по морям, океанам, в поисках своей пропавшей семьи. Чтобы не умереть, дельфину надо было время от времени всплывать на поверхность и подышать кислородом.

В этой игре была система password save -- в начале каждого этапа выдавался его код, введя который вы можете сразу попасть на этот этап. При анализе этих кодов (они состояли из шести латинских букв) оказалось, что они представляют из себя числа в двадцатишестиричной системе, с вектором основания ABCDEFGHIJKLMNOPQRSTUVWXYZ -- всеми латинскими буквами по алфавиту. В такой системе счисления, к примеру, десятичное число 10 будет записываться как K. А число FUCK, переведенное из этой системы в десятичную, будет выглядеть как 101462. (Проверьте.)

Переведя это число из подобной 26-ричной системы в двоичную и найдя тип контрольной суммы, я научился не только переходить на тот уровень игры, на которой захочу, но и отключать потребность в кислороде. Там оказался и битик, отвечающий за это.

<<<

В математике принято указывать основание системы счисления (с цифрами 012...9ABCD...Z) внизу-справа от числа. При этом основание записывается в десятичной системе счисления. Мы, в текстовых файлах "БАЗЫ", это будем помечать следующим образом: 1FC_16 обозначает 1FC в шестнадцатеричной системе счисления.

Заметим (проверьте по своей таблице), что 10..0_x=x^n, где n -- количество нулей после единицы.

<<<B1:2 EOF>>>



E-mail: hscool@netclub.ru
Hosted by uCoz