Система счисления задаётся своим основанием. Например, в десятичной системе
основание равно 10, в двоичной — 2, в шестнадцатеричной — 16.
В системе с основанием base можно использовать цифры со значениями
от 0 до base - 1.
Если основание больше 10, после цифр 0–9 используются буквы:
A = 10, B = 11, C = 12 и так далее до
Z = 35.
Числа в разных системах счисления удобно хранить в string.
Например, строка "2F" хранит две цифры шестнадцатеричного числа.
При этом s[0] — самая левая, то есть старшая цифра,
а s[s.size() - 1] — самая правая, то есть младшая.
Важно помнить: символ цифры и её числовое значение — разные вещи.
Например, '7' — это символ, а 7 — число.
Символы цифр идут по порядку, поэтому для обычных десятичных цифр можно
вычитать символ '0'. Аналогично можно получить символ цифры обратно.
char c = '7';
int x = c - '0'; // x == 7
int y = 5;
char d = '0' + y; // d == '5'
Для цифр больше 9 используются буквы. Здесь идея та же: буквы 'A',
'B', 'C' и дальше тоже идут по порядку.
char c = 'F';
int x = c - 'A' + 10; // x == 15
int y = 11;
char d = 'A' + (y - 10); // d == 'B'
Поэтому при работе с произвольной цифрой обычно сначала проверяют,
является ли она цифрой от '0' до '9' или буквой от
'A' до 'Z'.
Значение цифры зависит не только от самой цифры, но и от её позиции.
В десятичном числе 347 цифра 3 означает три сотни,
цифра 4 — четыре десятка, а цифра 7 — семь единиц.
То же самое происходит в любой системе счисления. Например, в системе с основанием 16
число 2F означает 2 × 16 + 15, потому что F = 15.
А двоичное число 1011 означает
1 × 8 + 0 × 4 + 1 × 2 + 1.
Чтобы перевести запись числа в обычное целое число, необязательно отдельно считать степени основания. Удобнее читать цифры слева направо.
Каждый раз уже разобранная часть числа сдвигается на один разряд влево.
В системе с основанием base такой сдвиг означает умножение на
base. После этого к результату добавляется значение следующей цифры.
Например, для шестнадцатеричного числа 2F сначала получаем 2,
затем умножаем его на 16 и добавляем значение F, то есть
15. Получается 47.
Этот способ называется схемой Горнера. Он одинаково работает для двоичной, десятичной, шестнадцатеричной и любой другой обычной позиционной системы счисления.
При переводе обычного целого числа в систему с основанием base
удобно использовать деление с остатком.
Остаток от деления на base показывает значение последней цифры числа.
После этого число делят на base и повторяют процесс.
Поэтому цифры получаются начиная с младшей, то есть в обратном порядке.
Например, если переводить число в двоичную систему, остаток каждый раз будет
либо 0, либо 1. Для шестнадцатеричной системы остаток
может быть от 0 до 15, причём значения от 10 до 15
нужно записывать буквами A–F.
Так как при переводе из int цифры часто получаются справа налево,
строку бывает удобно развернуть. Для этого есть функция reverse
из файла <algorithm>.
#include <algorithm>
reverse(s.begin(), s.end());