JavaRush /Blogue Java /Random-PT /Java: bits e bytes
Viacheslav
Nível 3

Java: bits e bytes

Publicado no grupo Random-PT
Java: bits e bytes - 1

Introdução

Se as pessoas contam no sistema numérico decimal, os computadores contam no sistema binário. E um programador deve saber como falar tanto com pessoas quanto com computadores. Esta revisão deve ajudar neste assunto. Às vezes há um mundo inteiro escondido atrás do óbvio. Proponho falar sobre este mundo. Por exemplo, há 7 dias na semana. Agora, vamos responder à pergunta: Qual é o número “7”? ) Em primeiro lugar, é um número natural inteiro (positivo). Também é um número decimal. Um número decimal é um número no sistema decimal. Quando dizemos "sistema numérico decimal", significa que o sistema numérico tem base 10 . A raiz mostra quantos dígitos podem ser usados ​​em um determinado sistema numérico para representar um número. A contagem regressiva é de zero. Assim, para representar números no sistema numérico decimal, usamos números de 0 a 9. Isso é bom, mas precisamos contar não apenas até 9, mas também além. Como ser? Por exemplo, o número 10. Para escrever este número, usamos até 2 dígitos. A posição de cada dígito no sistema decimal é chamada de casa decimal. Os dígitos são contados da direita para a esquerda:
Java: bits e bytes - 2
Além disso, o número decimal pode ser expandido da seguinte forma: 103 = 1*10^2 + 0*10^1 + 3*10^0
Java: bits e bytes - 3
O número cresce essencialmente da direita para a esquerda. Ou seja, no começo era 7, depois passou para 10. Portanto, os dígitos são contados da direita, começando do zero. Para que serve tudo isso? Isso ocorre porque não somos computadores. E enquanto contamos em decimal (ou seja, base 10), os computadores contam em binário (ou seja, base 2). Mas as regras que se aplicam a estes sistemas numéricos são as mesmas.
Java: bits e bytes - 4

Sistema Binário

O sistema binário é muito parecido com o sistema decimal, com a única diferença que o limite aqui não é 10, mas sim 2. Vamos comparar com um exemplo. Como representamos 11 em binário? É muito simples: basta dividir o número decimal pela base 2, ou seja, contar 11/2 em uma coluna. Exemplo:
Java: bits e bytes - 5
Ou aqui está um exemplo do WikiHow:
Java: bits e bytes - 6
Curiosamente, podemos representar um número em binário da mesma forma que em decimal: 111 em binário = 1*2^2 + 1*2^1 + 1*2^0 = 4 + 2 + 1
Java: bits e bytes - 7
Um exemplo de conversão de binário para decimal pode ser visto na calculadora online . Falando sobre o fato de que as regras de operação nos sistemas numéricos são as mesmas, vejamos a adição no sistema binário:
Java: bits e bytes - 8
Como você pode ver, transferimos dígitos durante a adição da mesma forma que no sistema decimal. A análise da adição pode ser vista, por exemplo, aqui: A propósito, alguma palavra “descarga” é mencionada periodicamente. E o que é isso? O lugar é apenas um “elemento estrutural” de representação de um número. Ou seja, o número 10 é composto por dois algarismos: precisamos de 2 algarismos, 2 casas, 2 elementos para escrever este número. É importante entendermos isso porque no sistema numérico binário, um dígito é um bit . A palavra Bit vem do inglês “dígito binário” , ou seja, um número binário. Pode ser 0 ou 1. Mas assim como lemos números e palavras como um todo, e não letra por letra, os computadores não leem um bit de cada vez. Para o “pedaço” mínimo de informação processada na RAM (a chamada menor unidade endereçável de informação), é lida uma sequência de 8 bits . Como existem 8 deles, este é chamado de "octeto". E também - a palavra mais conhecida Byte . Para lembrar o octeto, você pode lembrar que a palavra polvo (oito pernas) é traduzida para o inglês como polvo. Ou seja, aqui está exatamente o mesmo “octo” do título:
Java: bits e bytes - 9
Vamos pensar qual é o número máximo que podemos representar como 8 bits?
Java: bits e bytes - 10
E aqui surge a pergunta: e os números negativos? Para entender isso, vamos falar sobre como os bytes são representados em Java
Java: bits e bytes - 11

Java e Byte

Como podemos usar números negativos em Java? Isso é feito de forma simples. Em Java, os bytes são assinados. O dígito/bit mais à esquerda (também chamado de “bit mais significativo”) é transformado em uma espécie de “marcador” que responde à pergunta: “Este número é negativo?” Se a resposta for sim, então o marcador tem o valor 1. Caso contrário, é 0. Vejamos um exemplo de como transformar o número 5 em um número negativo 5:
Java: bits e bytes - 12
Com base nesta imagem, você pode entender os limites dentro dos quais se encontra um valor de Byte:
Java: bits e bytes - 13
Também está claro que:
  • se adicionarmos um a 127, obteremos -128.
  • se subtrairmos um de -128, obtemos 127.
Assim, Byte em Java pode assumir um valor de -128 a 127. Como lembramos, um byte é um octeto. E o dígito máximo/bit mais significativo tem número de série 7, pois contamos a partir de zero. Nesse caso, é fácil lembrar que um byte é igual a -2 elevado à potência de 7 (limite inferior) a 2 elevado à potência de 7 menos 1 (limite superior). Trabalhar com o tipo de dados em si é simples. Usamos o compilador Java online “repl.it” como “sandbox” para este artigo. https://repl.it/linguagens/java. Por exemplo, vamos executar o código que representará uma variável de byte em formato binário como uma string:
class Main {
  public static void main(String[] args) {
    byte octet = 5;
    String bin = String.format("%8s", Integer.toBinaryString(octet)).replace(' ', '0');
    System.out.println(bin);
  }
}
Trabalhar com bytes é usado ativamente ao trabalhar com fluxos de E/S. Você pode ler mais no tutorial da Oracle: " I/O Streams ". Além disso, em Java você pode usar um literal especial para especificar o valor como bits:
class Main {
  public static void main(String[] args) {
    byte data = 0b101;
    System.out.println(data);
  }
}
Java: bits e bytes - 14

Manipulação de bits

No que diz respeito a bytes e bits, não se pode deixar de mencionar várias manipulações de bits. Provavelmente a operação mais comum são as mudanças (mudança de bits ou mudança de bits). E tudo porque seu resultado traz claros benefícios práticos. Qual o uso? Deslocar para a esquerda N posições equivale a multiplicar o número por 2N. E um deslocamento para a direita é semelhante à mesma divisão. Assim, 5<<2 == 5*Math.pow(2,2) E para entender por que isso acontece, vamos examinar este exemplo com mais detalhes:
Java: bits e bytes - 15
A negação bit a bit NOT (Unário bit a bit), que é representada por um til, inverte os bits. É escrito como um til, por exemplo ~5.
public static void main(String[] args) {
	System.out.println(~5); //-6
 	System.out.println(~-5);//4
}
Isso mostra mais uma vez que quando Java muda o sinal de um número, além de inverter os valores dos bits bem no final, realizamos +1. E sem isso, como vemos, nosso número 5 muda. E para que permaneça o mesmo número de antes de mudar o sinal, você precisa fazer +1. AND bit a bit permite que você deixe dois números diferentes com o valor 1 por um bit somente se todos os bits tiverem o valor um. O que é interessante nisso pode ser que ele traz alguns benefícios de aplicação:
int x=4;
System.out.println((x&1) != 1);
Este código verifica a paridade do número x. Vejamos um exemplo:
Java: bits e bytes - 16
Usando Bitwise AND e Bitwise OR juntos, você pode usar máscaras:
public static void main(String[] args) {
    byte optionA=0b0100;
    byte optionB=0b0010;
    byte optionC=0b0001;
    byte value = (byte)(optionB | optionC);
    // Check for optionB
    if ((optionC & value) != 0b0000) {
      System.out.println("Yes");
    } else {
      System.out.println("No");
    }
  }
Consulte “ Opções de mascaramento com operadores bit a bit em Java ” para obter mais detalhes . A manipulação de bits é um tópico interessante sobre o qual foram escritas resenhas, artigos e livros separados. E a partir daqui começa o longo caminho para a criptografia. Como parte desta revisão, vale a pena entender por que funciona e como. Para obter mais informações sobre operações de bits, recomendo a leitura da análise do tproger: “ Sobre operações de bits ”.

Tipos primitivos

Então, um byte é um octeto, ou seja, 8 bits. É fácil lembrar que em Java também existem 8 tipos primitivos, coincidentemente. Um tipo primitivo é um tipo de dados incorporado em uma linguagem de programação, ou seja, disponível por padrão. byte é o menor tipo de dados primitivo em termos de consumo de memória com o qual Java pode trabalhar. Como dissemos anteriormente, um byte ocupa 8 bits. Portanto, o dígito mais significativo é o número 7. Portanto, o byte contém os valores de -2 elevado à 7ª potência até 2 elevado à 7ª potência menos 1 do resultado. Que outros tipos primitivos existem:
Java: bits e bytes - 17
Como podemos ver na tabela, os tipos de dados em termos de quantidade de dados ocupados dobram. Ou seja, short = 2 * byte e int = 2 * short. Na verdade, é fácil de lembrar. Lembre-se que byte = 8 bits. O fato de que não pode ser menos também é lembrado. Em inglês, um número inteiro é chamado de número inteiro. O tipo primitivo dele foi chamado de abreviatura int. Existe um número inteiro regular - int. Existe uma versão curta, curta, e uma versão longa, longa. Conseqüentemente, int ocupa 32 bits (4 bytes). A versão curta é 2 vezes menor - 16 bits (2 bytes), e a versão longa é duas vezes maior, ou seja, 64 bits (8 bytes). Portanto, um int pode armazenar no máximo um número de cerca de 2 bilhões e cem milhões. E long pode armazenar no máximo cerca de 9 quatrilhões (uma palavra bonita). Lembrando a velha piada sobre como um programador novato pensa que um quilobyte tem 1000 bytes, e um programador completo acredita que um quilograma tem 1024 gramas, podemos entender:
1 mb = 1024 Kbyte = 1024 * 1024 = 1048576 bytes
1 int = 4 bytes
1 mb = 262144 int
Aliás, um leitor atento deve ter notado que existem apenas 7 tipos na imagem. 8 tipo primitivo é booleano. boolean é um tipo de dados booleano que possui apenas dois valores: verdadeiro e falso. Mas surge a pergunta - qual é o tamanho? A especificação da Java Virtual Machine e a seção " 2.3.4. O tipo booleano " nos responderão:
Java: bits e bytes - 18
Ou seja, apenas um booleano terá o mesmo valor que um int. Se declararmos um array booleano, cada elemento do array ocupará 1 byte. São milagres :)

Conclusão

Sugiro que você se familiarize com mais alguns materiais para consolidação: #Viacheslav
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION