Рубрики
Без рубрики

Двоичные числа в Java

Узнайте, как конвертировать двоичные числа в десятичные и наоборот.

Автор оригинала: baeldung.

1. введение

Двоичная система счисления использует 0 и 1 для представления чисел. Компьютеры используют двоичные числа для хранения и выполнения операций с любыми данными.

В этом уроке мы узнаем, как преобразовать двоичный код в десятичный и наоборот. Кроме того, мы будем выполнять над ними сложение и вычитание.

2. Двоичный литерал

Java 7 представила двоичный литерал. Это упростило использование двоичных чисел.

Чтобы использовать его, нам нужно поставить перед номером префикс 0B или 0b:

@Test
public void given_binaryLiteral_thenReturnDecimalValue() {

    byte five = 0b101;
    assertEquals((byte) 5, five);

    short three = 0b11;
    assertEquals((short) 3, three);

    int nine = 0B1001;
    assertEquals(9, nine);

    long twentyNine = 0B11101;
    assertEquals(29, twentyNine);

    int minusThirtySeven = -0B100101;
    assertEquals(-37, minusThirtySeven);

}

3. Преобразование Двоичных Чисел

В этом разделе мы узнаем, как преобразовать двоичное число в десятичный формат и наоборот. Здесь мы сначала используем встроенную функцию Java для преобразования, а затем напишем наши собственные методы для того же самого.

3.1. Десятичное или двоичное число

Целое число имеет функцию с именем в двоичную строку для преобразования десятичного числа в его двоичную строку:

@Test
public void given_decimalNumber_then_convertToBinaryNumber() {
    assertEquals("1000", Integer.toBinaryString(8));
    assertEquals("10100", Integer.toBinaryString(20));
}

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

Чтобы преобразовать десятичное число n в двоичный формат, нам нужно:

  1. Разделите n на 2, отметив частное q и остаток r
  2. Разделите q на 2, отметив его частное и остаток
  3. Повторяйте шаг 2, пока мы не получим 0 в качестве частного
  4. Объедините в обратном порядке все остатки

Давайте рассмотрим пример преобразования 6 в эквивалент двоичного формата:

  1. Сначала разделите 6 на 2: частное 3, остаток 0
  2. Затем разделите 3 на 2: частное 1, остаток 1
  3. И, наконец, разделите 1 на 2: частное 0, остаток 1
  4. 110

Давайте теперь реализуем приведенный выше алгоритм:

public Integer convertDecimalToBinary(Integer decimalNumber) {

    if (decimalNumber == 0) {
        return decimalNumber;
    }

    StringBuilder binaryNumber = new StringBuilder();
    Integer quotient = decimalNumber;

    while (quotient > 0) {
        int remainder = quotient % 2;
        binaryNumber.append(remainder);
        quotient /= 2;
    }

    binaryNumber = binaryNumber.reverse();
    return Integer.valueOf(binaryNumber.toString());
}

3.2. Двоичное или десятичное число

Для анализа двоичной строки класс Integer предоставляет функцию parseInt :

@Test
public void given_binaryNumber_then_ConvertToDecimalNumber() {
    assertEquals(8, Integer.parseInt("1000", 2));
    assertEquals(20, Integer.parseInt("10100", 2));
}

Здесь функция parseInt принимает в качестве входных данных два параметра:

  1. Двоичная строка, подлежащая преобразованию
  2. Основание или основание системы счисления, в которой должна быть преобразована входная строка

Теперь давайте попробуем написать вашу собственную логику преобразования двоичного числа в десятичное:

  1. Начните с крайней правой цифры
  2. Умножьте каждую цифру на 2^{положение} этой цифры – здесь положение самой правой цифры равно нулю, и оно увеличивается по мере того, как мы перемещаемся в левую сторону
  3. Добавьте результат всех умножений, чтобы получить конечное десятичное число

Еще раз, давайте посмотрим на наш метод в действии:

  1. Первый, 101011 = (1*2^5) + (0*2^4) + (1*2^3) + (0*2^2) + (1*2^1) + (1*2^0)
  2. Следующий, 101011 = (1*32) + (0*16) + (1*8) + (0*4) + (1*2) + (1*1)
  3. Тогда, + 0 + 8 + 0 + 2 + 1
  4. И, наконец,,

Давайте, наконец, закодируем описанные выше шаги:

public Integer convertBinaryToDecimal(Integer binaryNumber) {

    Integer decimalNumber = 0;
    Integer base = 1;

    while (binaryNumber > 0) {
        int lastDigit = binaryNumber % 10;
        binaryNumber = binaryNumber / 10;
        decimalNumber += lastDigit * base;
        base = base * 2;
    }
    return decimalNumber;
}

4. Арифметические операции

В этом разделе мы сосредоточимся на выполнении арифметических операций с двоичными числами.

4.1. Дополнение

Точно так же, как при сложении десятичных чисел, мы начинаем добавлять числа с самой правой цифры.

При добавлении двух двоичных цифр нам нужно помнить следующие правила:

  • 0 +
  • 0 +
  • 1 +
  • 1 + 1 +

Эти правила могут быть реализованы следующим образом:

public Integer addBinaryNumber(Integer firstNum, Integer secondNum) {
    StringBuilder output = new StringBuilder();
    int carry = 0;
    int temp;
    while (firstNum != 0 || secondNum != 0) {
        temp = (firstNum % 10 + secondNum % 10 + carry) % 2;
        output.append(temp);

        carry = (firstNum % 10 + secondNum % 10 + carry) / 2;
        firstNum = firstNum / 10;
        secondNum = secondNum / 10;
    }
    if (carry != 0) {
        output.append(carry);
    }
    return Integer.valueOf(output.reverse().toString());
}

4.2. Вычитание

Существует множество способов вычитания двоичных чисел. В этом разделе мы изучим метод дополнения для выполнения вычитания.

Давайте сначала поймем, что является дополнением к числу.

Чье-либо дополнение к числу-это число, полученное путем отрицания каждой цифры двоичного числа. Это означает, что просто замените 1 на 0 и 0 на 1 :

public Integer getOnesComplement(Integer num) {
    StringBuilder onesComplement = new StringBuilder();
    while (num > 0) {
        int lastDigit = num % 10;
        if (lastDigit == 0) {
            onesComplement.append(1);
        } else {
            onesComplement.append(0);
        }
        num = num / 10;
    }
    return Integer.valueOf(onesComplement.reverse().toString());
}

Чтобы выполнить вычитание двух двоичных чисел с использованием дополнения, нам нужно:

  1. Вычислите дополнение единицы к подзаголовку s
  2. Добавить s и дополнить
  3. Если перенос создается на шаге 2, добавьте этот перенос в результат шага 2, чтобы получить окончательный ответ.
  4. Если перенос не генерируется на шаге 2, то дополнение к результату шага 2 является окончательным ответом. Но в данном случае ответ отрицательный

Давайте выполним описанные выше шаги:

public Integer substractBinaryNumber(Integer firstNum, Integer secondNum) {
    int onesComplement = Integer.valueOf(getOnesComplement(secondNum));
    StringBuilder output = new StringBuilder();
    int carry = 0;
    int temp;
    while (firstNum != 0 || onesComplement != 0) {
        temp = (firstNum % 10 + onesComplement % 10 + carry) % 2;
        output.append(temp);
        carry = (firstNum % 10 + onesComplement % 10 + carry) / 2;

        firstNum = firstNum / 10;
        onesComplement = onesComplement / 10;
    }
    String additionOfFirstNumAndOnesComplement = output.reverse().toString();
    if (carry == 1) {
        return addBinaryNumber(Integer.valueOf(additionOfFirstNumAndOnesComplement), carry);
    } else {
        return getOnesComplement(Integer.valueOf(additionOfFirstNumAndOnesComplement));
    }
}

5. Заключение

В этой статье мы узнали, как преобразовать двоичные числа в десятичные и наоборот. Затем мы выполнили арифметические операции, такие как сложение и вычитание двоичных чисел.

Полный код, используемый в этой статье, доступен на GitHub .