Перейти к основному содержимому

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

· 6 мин. чтения

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. Десятичное число в двоичное

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

@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 = (12^5) + (02^4) + (12^3) + (02^2) + (12^1) + (12^0) )
  2. Далее, 101011 = (132) + (016) + (18) + (04) + (12) + (11)
  3. Тогда 101011 = 32 + 0 + 8 + 0 + 2 + 1
  4. И, наконец, 101011 = 43.

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

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 = 0
  • 0 + 1 = 1
  • 1 + 1 = 10
  • 1 + 1 + 1 = 11

Эти правила могут быть реализованы как:

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 .