Numeri binari in Java

1. Introduzione

Il sistema di numeri binari utilizza 0 e 1 per rappresentare i numeri. I computer utilizzano numeri binari per archiviare ed eseguire operazioni su qualsiasi dato.

In questo tutorial impareremo come convertire un binario in decimale e viceversa. Inoltre, eseguiremo addizioni e sottrazioni su di essi.

2. Letterale binario

Java 7 ha introdotto il letterale binario. Ha semplificato l'utilizzo dei numeri binari.

Per usarlo, dobbiamo anteporre al numero 0B o 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. Conversione di numeri binari

In questa sezione impareremo come convertire un numero binario nel suo formato decimale e viceversa. Qui, useremo prima una funzione Java incorporata per la conversione, quindi scriveremo i nostri metodi personalizzati per lo stesso.

3.1. Decimale in un numero binario

Integer ha una funzione denominata toBinaryString per convertire un numero decimale nella sua stringa binaria:

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

Ora possiamo provare a scrivere la nostra logica per questa conversione. Prima di scrivere il codice, capiamo innanzitutto come convertire un numero decimale in uno binario.

Per convertire un numero decimale n nel suo formato binario, dobbiamo:

  1. Dividi n per 2, annotando il quoziente qe il resto r
  2. Dividi q per 2, annotando il suo quoziente e il resto
  3. Ripetere il passaggio 2 fino a ottenere 0 come quoziente
  4. Concatena in ordine inverso tutti i resti

Vediamo un esempio di conversione di 6 nel suo equivalente in formato binario:

  1. Per prima cosa, dividi 6 per 2: quoziente 3, resto 0
  2. Quindi, dividi 3 per 2: quoziente 1, resto 1
  3. Infine, dividi 1 per 2: quoziente 0, resto 1
  4. 110

Implementiamo ora l'algoritmo di cui sopra:

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. Binario a un numero decimale

Per analizzare una stringa binaria, la classe Integer fornisce una funzione parseInt :

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

Qui, la funzione parseInt accetta due parametri come input:

  1. Stringa binaria da convertire
  2. Radice o base del sistema numerico in cui la stringa di input deve essere convertita

Ora proviamo a scrivere la nostra logica per convertire un numero binario in decimale:

  1. Inizia con la cifra più a destra
  2. Moltiplica ogni cifra per 2 ^ {posizione} di quella cifra: qui, la posizione della cifra più a destra è zero e aumenta man mano che ci spostiamo a sinistra
  3. Aggiungi il risultato di tutte le moltiplicazioni per ottenere il numero decimale finale

Di nuovo, vediamo il nostro metodo in azione:

  1. Primo, 101011 = (1 * 2 ^ 5) + (0 * 2 ^ 4) + (1 * 2 ^ 3) + (0 * 2 ^ 2) + (1 * 2 ^ 1) + (1 * 2 ^ 0 )
  2. Successivamente, 101011 = (1 * 32) + (0 * 16) + (1 * 8) + (0 * 4) + (1 * 2) + (1 * 1)
  3. Quindi, 101011 = 32 + 0 + 8 + 0 + 2 + 1
  4. E infine, 101011 = 43

Infine codifichiamo i passaggi precedenti:

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. Operazioni aritmetiche

In questa sezione, ci concentreremo sull'esecuzione delle operazioni aritmetiche sui numeri binari.

4.1. Aggiunta

Proprio come l'aggiunta del numero decimale, iniziamo ad aggiungere i numeri dalla cifra più a destra.

Durante l'aggiunta di due cifre binarie, dobbiamo ricordare le seguenti regole:

  • 0 + 0 = 0
  • 0 + 1 = 1
  • 1 + 1 = 10
  • 1 + 1 + 1 = 11

Queste regole possono essere implementate come:

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. Sottrazione

Esistono molti modi per sottrarre numeri binari. In questa sezione impareremo il metodo del complemento a uno per eseguire la sottrazione.

Per prima cosa capiamo qual è il complemento di un numero.

One's complement of a number is a number obtained by negating each digit of the binary number. That means just replace 1 by 0 and 0 by 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()); }

To do subtraction of two binary numbers using one's complement, we need to:

  1. Calculate the one's complement of the subtrahend s
  2. Add s and the minuend
  3. If a carry gets generated in step 2, then add that carry to step 2's result to get the final answer.
  4. If a carry is not generated in step 2, then the one's complement of step 2's result is the final answer. But in this case, the answer is negative

Let's implement the above steps:

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. Conclusion

In questo articolo, abbiamo imparato come convertire i numeri binari in decimali e viceversa. Quindi, abbiamo eseguito operazioni aritmetiche come addizioni e sottrazioni su numeri binari.

Il codice completo utilizzato in questo articolo è disponibile su GitHub.