Números binários em Java
1. Introdução
O sistema de números binários usa 0s e 1s para representar números. Os computadores usam números binários para armazenar e executar operações em qualquer dado.
Neste tutorial, aprenderemos como converter binário em decimal e vice-versa. Além disso, vamos realizar adição e subtração neles.
2. Literal binário
O Java 7 introduziu o literal binário. Simplificou o uso de números binários.
Para usá-lo, precisamos prefixar o número com 0B ou 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. Conversão de números binários
Nesta seção, aprenderemos como converter um número binário em seu formato decimal e vice-versa. Aqui, primeiro usaremos uma função Java integrada para conversão e, em seguida, escreveremos nossos métodos personalizados para a mesma.
3.1. Decimal para um número binário
Integer tem uma função chamadatoBinaryString para converter um número decimal em sua string binária:
@Test
public void given_decimalNumber_then_convertToBinaryNumber() {
assertEquals("1000", Integer.toBinaryString(8));
assertEquals("10100", Integer.toBinaryString(20));
}
Agora, podemos tentar escrever nossa própria lógica para essa conversão. Antes de escrever o código, vamos primeiro entender como converter um número decimal em um binário.
Para converter um número decimaln em seu formato binário, precisamos:
-
Dividan por 2, observando o quocienteq e o restanter
-
Dividaq por 2, observando seu quociente e o restante
-
Repita a etapa 2 até obtermos 0 como quociente
-
Concatene na ordem inversa todos os restantes
Vejamos um exemplo de conversão de 6 em seu equivalente no formato binário:
-
Primeiro, divida 6 por 2: quociente 3, restante 0
-
Em seguida, divida 3 por 2: quociente 1, restante 1
-
E, finalmente, divida 1 por 2: quociente 0, restante 1
-
110
Vamos agora implementar o algoritmo acima:
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. Binário para um número decimal
Para analisar uma string binária, a classeInteger fornece uma funçãoparseInt:
@Test
public void given_binaryNumber_then_ConvertToDecimalNumber() {
assertEquals(8, Integer.parseInt("1000", 2));
assertEquals(20, Integer.parseInt("10100", 2));
}
Aqui, a funçãoparseInt leva dois parâmetros como entrada:
-
Cadeia binária a ser convertida
-
Raiz ou base do sistema numérico no qual a sequência de entrada deve ser convertida
Agora, vamos tentar escrever nossa própria lógica para converter um número binário em decimal:
-
Comece com o dígito mais à direita
-
Multiplique cada dígito por 2 ^ {posição} desse dígito - aqui, a posição do dígito mais à direita é zero e aumenta à medida que nos movemos para o lado esquerdo
-
Adicione o resultado de todas as multiplicações para obter o número decimal final
Mais uma vez, vamos ver nosso método em ação:
-
Primeiro, 101011 = (1 * 2 ^ 5) + (0 * 2 ^ 4) + (1 * 2 ^ 3) + (0 * 2 ^ 2) + (1 * 2 ^ 1) + (1 * 2 ^ 1) + (1 * 2 ^ 0 )
-
Em seguida, 101011 = (1 * 32) + (0 * 16) + (1 * 8) + (0 * 4) + (1 * 2) + (1 * 1)
-
Então, 101011 = 32 + 0 + 8 + 0 + 2 + 1
-
E, finalmente, 101011 = 43
Vamos finalmente codificar as etapas acima:
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. Operaçoes aritimeticas
Nesta seção, vamos nos concentrar em realizar as operações aritméticas em números binários.
4.1. Adição
Assim como a adição do número decimal, começamos a adicionar os números do dígito mais à direita.
Ao adicionar dois dígitos binários, precisamos lembrar as seguintes regras:
-
0 + 0 = 0
-
0 + 1 = 1
-
1 + 1 = 10
-
1 + 1 + 1 = 11
Essas regras podem ser implementadas como:
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. Subtração
Existem muitas maneiras de subtrair números binários. Nesta seção, aprenderemos um método complementar para fazer a subtração.
Vamos primeiro entender o que é o complemento de um número.
O complemento de um número é um número obtido pornegating 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());
}
Para fazer a subtração de dois números binários usando o complemento de um, precisamos:
-
Calcule o complemento de um do subtraendos
-
Adicionese o minuendo
-
Se um transporte for gerado na etapa 2, adicione esse transporte ao resultado da etapa 2 para obter a resposta final.
-
Se um transporte não for gerado na etapa 2, então o complemento de um do resultado da etapa 2 é a resposta final. Mas neste caso, a resposta é negativa
Vamos implementar as etapas acima:
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. Conclusão
Neste artigo, aprendemos como converter números binários em decimais e vice-versa. Em seguida, realizamos operações aritméticas como adição e subtração em números binários.
O código completo usado neste artigo está disponível emGitHub.