Двоичная, десятичная, восьмеричная и прочие системы в 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.
- (Факультатив)Написать метод перевода числа из “любой” системы в десятичную. // Мы вернёмся к этому методу в будущем.