015 Java Binary and Decimal Issue

Двоичная, десятичная, восьмеричная и прочие системы в 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. Это удобно и очень важно при визуализации чисел.

Порядковый номер цифры в числе76543210
Степени двойки2^72^62^52^42^32^22^12^0
Чему в итоге равны степени1286432168421
Пример двоичного числа01001110
Как считается десятичное0*1281*640*320*161*81*41*20*1
Результат вычислений064008420

Сумма чисел из последней строчки 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 ограничиться целыми позитивными числами до шестнадцатеричной системы. Она нам важна, так как в ней информатике хранят цветовую гамму.

Дополнительные ссылки #

  1. Бинарные(двоичные) числа в Java - официальная документация.
  2. Троичный компьютер
  3. Шестнадцатеричная система
  4. Двадцатиричная система
  5. Шести десятеричная
  6. Двенадцатеричная система счисления
  7. Цифры майя

Домашнее задание #

  1. Ознакомиться со всеми дополнительными ссылками.
  2. Написать метод, который “вычитывает из строковых литералов десятичные и двоичные числа. Используйте метод - " Integer.parseInt();
  3. Написать свой собственный класс ConvertDigits
    • добавить интерактивность, общение программы с пользователем.
    • не использовать цикл while.

Задачи с очень повышенным уровнем сложности. #

  1. Написать метод, который решает вопрос с делением на числа из систем свыше десятичной - 11-16.
  2. (Факультатив)Написать метод перевода числа из “любой” системы в десятичную. // Мы вернёмся к этому методу в будущем.