Números binários em Java

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:

  1. Dividan por 2, observando o quocienteq e o restanter

  2. Dividaq por 2, observando seu quociente e o restante

  3. Repita a etapa 2 até obtermos 0 como quociente

  4. Concatene na ordem inversa todos os restantes

Vejamos um exemplo de conversão de 6 em seu equivalente no formato binário:

  1. Primeiro, divida 6 por 2: quociente 3, restante 0

  2. Em seguida, divida 3 por 2: quociente 1, restante 1

  3. E, finalmente, divida 1 por 2: quociente 0, restante 1

  4. 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:

  1. Cadeia binária a ser convertida

  2. 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:

  1. Comece com o dígito mais à direita

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

  3. 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:

  1. Primeiro, 101011 = (1 * 2 ^ 5) + (0 * 2 ^ 4) + (1 * 2 ^ 3) + (0 * 2 ^ 2) + (1 * 2 ^ 1) + (1 * 2 ^ 1) + (1 * 2 ^ 0 )

  2. Em seguida, 101011 = (1 * 32) + (0 * 16) + (1 * 8) + (0 * 4) + (1 * 2) + (1 * 1)

  3. Então, 101011 = 32 + 0 + 8 + 0 + 2 + 1

  4. 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:

  1. Calcule o complemento de um do subtraendos

  2. Adicionese o minuendo

  3. Se um transporte for gerado na etapa 2, adicione esse transporte ao resultado da etapa 2 para obter a resposta final.

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