
— Привет, Амиго!
— Привет, Билаабо!
Хочу рассказать тебе немного про различные системы счисления.
Ты уже слышал, что люди пользуются десятичной системой счисления. Вот главные факты этого подхода:
1) Для записи числа используются 10 цифр: 0,1, 2, 3, 4, 5, 6, 7, 8, 9.
2) Число 543 значит 5 сотен + 4 десятка + 3 единицы.
Эта равносильно записи 5*100 + 4*10 + 3*1, что можно записать как 5*102+4*101+3*100
Обрати внимание – тысячи, сотни, десятки и единицы – это степени числа 10.
1) Единица – это 10 в нулевой степени.
2) Десять – это 10 в первой степени
3) Сто – это 10 во второй степени
4) Тысяча – это 10 в третьей степени и т.д.
— Ага. Понятно.
— А теперь представь, что цифр всего 8. Тогда у нас есть восьмеричная система счисления и вот ее главные факты:
1) Для записи числа используются 8 цифр: 0,1, 2, 3, 4, 5, 6, 7.
2) Число 5438 значит 5*82+4*81+3*80. Т.е. это 5*64+4*8+3*1 = 320+32+3=35510
Я написал снизу числа знаки 8 и 10, чтобы мы знали, сколько цифр используется для его записи.
— Вроде как и ясно. Я думаю, я бы смог перевести число из восьмеричной системы в десятичную. Но наоборот – вряд ли.
— Все не так уж и сложно. Представь, что тебе нужно перевести кучу песка на нескольких грузовых машинах. У тебя есть карьерные самосвалы, обычные, и совсем маленькие машинки. Но надо, чтобы машины не ехали полупустыми.
Как бы ты возил?
— Сначала я бы насыпал в карьерные самосвалы, они самые большие. Затем, когда понял, что для заполнения машины песка не хватит, то перешел бы на машины поменьше. Затем еще меньше.
— Тут все тоже очень похоже. Давай попробуем перевести число 35510 обратно в восьмеричный формат.
Сначала мы разделим его на 64 (82), получим 5 целых и 35 в остатке. Значит первая цифра нашего числа – 5. Затем разделим остаток на 8(81), получим 4 и 3 в остатке. Так и получится число 5438.
Можно, кстати, пойти и с другой стороны. Ведь 5438 ==5*64+4*8+3 == ((5)*8+4)*8+3. Наши восьмеричные «десятки» и «сотни» обязательно делятся на 8. Значит, остаток от деления на 8 это и будут наши восьмеричные единицы.
Поделим сначала число 355 на 8. Получим 44 и 3 в остатке. Т.е. 355=44*8+3. А 44 можно представить как 5*8+4. Значит 355= (5*8+4)*8+3; Вот наши цифры: 5,4,3. Искомое число 5438
— В общем вроде понятно, но надо немного попрактиковаться, чтобы окончательно во всем разобраться.
— В программировании очень часто используются числа с различным основанием (количеством цифр). Самые популярные – это 2, 8, 10, 16, 64.
— А зачем это нужно. Зачем нужны числа, состоящие из 2, 8, 16 и 64 цифр?
— Дело во внутреннем устройстве процессора. Очень упрощенно — если в проводе есть ток, то говорят, что в нем «единица», если тока нет, то в нем «ноль». Все числа хранятся в памяти в виде ячеек. Устройство таких ячеек очень примитивно. Они тоже могу хранить только 0 или 1.
Зато такое упрощение всего (только 0 или 1) дало возможность сделать элементы внутри процессора и памяти очень маленькими. Современные процессоры и модули памяти включают миллиарды различных элементов. При том, что их площадь зачастую не превышает квадратного сантиметра.
— Ничего себе. Буду знать.
— Теперь перейдем к двоичным числам. Там то же самое, что и с восьмеричными, только еще проще.
1) Для записи числа используются 2 цифры: 0,1
2) Число 1012 значит 1*22+0*21+1*20. Т.е. это 1*4+0*2+1*1 =4+1=510
— Да. Я помню. Одна ячейка, которая принимает значение 0 или 1 называется битом. Но т.к. в ней можно сохранить очень мало информации, то их объединяют в группы по 8. И называют такую группу – байтом.
— Именно. Байт – это группа из восьми бит. В нем можно хранить значения: 00000000, 00000001, …, 11111111. Которые соответствуют десятичным 0,1,… 255. Всего 256 значений.
Какое самое большое целое число в Java? Вернее его тип?
— long. long состоит из 8 байт. Т.е. 64 бита и может хранить значения от -263 до 263-1
— Ага. Я не буду касаться темы, как переводить числа из десятичной системы в двоичную или наоборот. Иначе лекция слишком затянется.
Давай лучше еще немного расскажу про 16-ричную систему счисления.
— Да, очень интересно. Для двоичной и восьмеричной систем мы просто выкинули цифры начиная с двойки или восьмерки. А тут как? Мы добавим новые цифры?
— Именно! Смотри:
1) Для записи числа используются 16 цифр: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
2) Число 54316 значит 5*162+4*161+3*160. Т.е. это 5*256+4*16+3*1 =1280+64+3=134710
— Т.е. мы просто добавили буквы в качестве цифр? О_о
— Ага. А что в этом такого? Зачем придумывать новые цифры, когда с этой ролью отлично справляются буквы. Вот смотри:
Шестнадцатеричная цифра | Десятичное значение |
---|---|
0 | 0 |
1 | 1 |
8 | 8 |
9 | 9 |
A | 10 |
B | 11 |
C | 12 |
D | 13 |
E | 14 |
F | 15 |
Про перевод из десятичной системы в шестнадцатеричную тоже рассказывать не буду. Зато есть один интересный факт. Шестнадцатеричная цифра – это ровно 4 бита со значениями от 0 до 15. Поэтому один байт можно записать восемью двоичными цифрами (0 или 1) или двумя шестнадцатеричными.
Пример:
Десятичное число | Двоичное число | Шестнадцатеричное число |
---|---|---|
0 | 0000 0000 | 00 |
1 | 0000 0001 | 01 |
15 | 0000 1111 | 0f |
16 | 0001 0000 | 10 |
31 | 0001 1111 | 1f |
32 | 0010 0000 | 20 |
128 | 1000 0000 | 80 |
129 | 1000 0001 | 81 |
255 | 1111 1111 | ff |
Шестнадцатеричное представление легко приводится к двоичному (и обратно). Поэтому, если где-то в программировании нужно показать именно внутреннее байтовое представление числа, то очень редко прибегают к двоичной записи через 0 и 1. Слишком длинно и не понятно. Шестнадцатеричная запись гораздо читабельней и компактней.
— Согласен. Даже мне понравилось.
— Кстати, в Java можно прямо в коде записывать числа в различных системах счисления:
Основание | Отличительный признак | Примеры | Неправильные числа |
---|---|---|---|
2 | 0b в начале числа | 0b00001111 | 0b1111121 |
8 | 0 в начале числа | 01234343 | 0128 |
10 | нет | 95459 | 909a |
16 | 0x в начале числа | 0x10ff | 0x1cgh |
— Отличная лекция. Спасибо, Билаабо.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ