Двоичная, десятичная, восьмеричная и прочие системы в Java и преобразования между ними — введение в Java 015 #
Для усвоения этого урока достаточно знать циклы for (while, do-while), оператор выбора switch, условный оператор **if **, знание и уверенное пользование арифметическим оператором modulo.
Это один из лучших примеров, который показывает, что первоначально абсолютно неподъёмная задача при решении оказывается не такой уж и страшной.
Мы уже рассматривали во главе, которая знакомила нас с while как из десятичных чисел получить двоичные.
Повторение, 78 превращаем в 1001110.
78 : 2 = 39 остаток: 0
39 : 2 = 19 остаток: 1
19 : 2 = 9 остаток: 1
9 : 2 = 4 остаток: 1
4 : 2 = 2 остаток: 0
2 : 2 = 1 остаток: 0
1 : 2 = 0 остаток: 1
Давайте переведём двоичное число в десятичное. Давайте возьмём уже известное нам число 1001110. В одном байте восемь битов. Число 1001110 состоит из семи цифр. В таких случая часто дописывают недостающие ноли и 100_1110 превращается в 0100_1110. Это удобно и очень важно при визуализации чисел.
Порядковый номер цифры в числе | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Степени двойки | 2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 |
Чему в итоге равны степени | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
Пример двоичного числа | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 |
Как считается десятичное | 0*128 | 1*64 | 0*32 | 0*16 | 1*8 | 1*4 | 1*2 | 0*1 |
Результат вычислений | 0 | 64 | 0 | 0 | 8 | 4 | 2 | 0 |
Сумма чисел из последней строчки 64+8+4+2 = 78
Если с приведёнными примерами всё понятно, то можно перейти дальше и записать оба примера в Java.
Переведём число из десятичной системы в двоичную, пока не забыли.
public static String convertDecimalToBinary(int decimal) {
int remainder;
String output = "";
while (decimal > 0) {
remainder = (decimal % 2);
output = Integer.toString(remainder) + output;
decimal = decimal / 2;
}
return output;
}
И обратно из двоичной в десятичную
public static int convertBinaryToDecimal(int binaryDigit) {
int decimal = 0;
int n = 0;
int temp = 0;
while (binaryDigit > 0) {
temp = binaryDigit % 10;
decimal += temp * Math.pow(2, n);
binaryDigit = binaryDigit / 10;
n++;
}
return decimal;
}
Замечу, что это простейший метод преобразования, который работает только с целыми числами больше нуля. Однако краткость этого метода должна помочь понять суть методики. Единственное, что стоит особенно подчеркнуть - результат работы метода строковое значение.
Если поработать над читаемостью метода convertDecimalToBinary, то мы заметим, что у нас (как минимум) дважды используется magicNumber 2 . Если мы догадаемся назвать это число systemIndex, то это будет частью решения метода convertDecimalToAnything.
public static String convertDecimalToAnything(int decimalDigit, int systemIndex) {
int remainder;
String output = "";
while (decimalDigit > 0) {
remainder = (decimalDigit % systemIndex);
output = Integer.toString(remainder) + output;
decimalDigit = decimalDigit / systemIndex;
}
return output;
}
Теоретически, можно подумать как из бинарной системы перевести числа в любую другую систему. Но зачем? Если есть метод преобразования бинарного числа в десятичную систему, а потом в любую другую.
У нас только одна проблема, наша система работает с числами систем меньше десятичной. Для того, что бы нам одолеть системы свыше десятичной, нам надо понять, что происходит с числом, когда его делят на 11, 12, 13, 14, 15, 16 и так далее. И здесь нам должен помочь switch, который будет перехватывать результаты деления свыше 10 и подставлять в output вместо числовых значений буквенные A, B, C, D, E, F и так далее.
Рекомендую в рамках Java ограничиться целыми позитивными числами до шестнадцатеричной системы. Она нам важна, так как в ней информатике хранят цветовую гамму.
Дополнительные ссылки #
- Бинарные(двоичные) числа в Java - официальная документация.
- Троичный компьютер
- Шестнадцатеричная система
- Двадцатиричная система
- Шести десятеричная
- Двенадцатеричная система счисления
- Цифры майя
- Пример применения - https://smallseotools.com/de/rgb-to-hex/
Домашнее задание #
- Ознакомиться со всеми дополнительными ссылками.
- Написать метод, который “вычитывает из строковых литералов десятичные и двоичные числа. Используйте метод - " Integer.parseInt();
- Написать свой собственный класс ConvertDigits
- добавить интерактивность, общение программы с пользователем.
- не использовать цикл while.
Задачи с очень повышенным уровнем сложности. #
- Написать метод, который решает вопрос с делением на числа из систем свыше десятичной - 11-16.
- (Факультатив)Написать метод перевода числа из “любой” системы в десятичную. // Мы вернёмся к этому методу в будущем.