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 в двоичный формат, нам нужно:
- Разделите n на 2, отметив частное q и остаток r
- Разделите q на 2, отметив его частное и остаток
- Повторяйте шаг 2, пока мы не получим 0 в качестве частного
- Объедините в обратном порядке все остатки
Давайте рассмотрим пример преобразования 6 в эквивалент двоичного формата:
- Сначала разделите 6 на 2: частное 3, остаток 0
- Затем разделите 3 на 2: частное 1, остаток 1
- И, наконец, разделите 1 на 2: частное 0, остаток 1
- 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 принимает в качестве входных данных два параметра:
- Двоичная строка, подлежащая преобразованию
- Основание или основание системы счисления, в которой должна быть преобразована входная строка
Теперь давайте попробуем написать вашу собственную логику преобразования двоичного числа в десятичное:
- Начните с крайней правой цифры
- Умножьте каждую цифру на 2^{положение} этой цифры – здесь положение самой правой цифры равно нулю, и оно увеличивается по мере того, как мы перемещаемся в левую сторону
- Добавьте результат всех умножений, чтобы получить конечное десятичное число
Еще раз, давайте посмотрим на наш метод в действии:
- Первый, 101011 = (1*2^5) + (0*2^4) + (1*2^3) + (0*2^2) + (1*2^1) + (1*2^0)
- Следующий, 101011 = (1*32) + (0*16) + (1*8) + (0*4) + (1*2) + (1*1)
- Тогда, + 0 + 8 + 0 + 2 + 1
- И, наконец,,
Давайте, наконец, закодируем описанные выше шаги:
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()); }
Чтобы выполнить вычитание двух двоичных чисел с использованием дополнения, нам нужно:
- Вычислите дополнение единицы к подзаголовку s
- Добавить s и дополнить
- Если перенос создается на шаге 2, добавьте этот перенос в результат шага 2, чтобы получить окончательный ответ.
- Если перенос не генерируется на шаге 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 .