Запись двоичного числа как 1000100В - 1

— Привет, Амиго!

— Привет, Билаабо!

Хочу рассказать тебе немного про различные системы счисления.

Ты уже слышал, что люди пользуются десятичной системой счисления. Вот главные факты этого подхода:

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

— Отличная лекция. Спасибо, Билаабо.