JavaRush /Blogue Java /Random-PT /Negação bit a bit - por que isso acontece?
Alex Bolgov
Nível 37
Ташкент

Negação bit a bit - por que isso acontece?

Publicado no grupo Random-PT
Olá a todos :) Ao ler o artigo Operações bit a bit, eu, como alguns outros, tive uma dúvida: por que, quando invertemos o número 342, obtemos -343. É assim que aparece no artigo: Negação bit a bit - por que então - 1Quem é especialmente curioso (como eu) tem uma dúvida: “ei, mas 010101001 é menor que 101010110, é lógico que deveria ser menor que 342 e positivo”. Digitando-o em qualquer conversor de números online ou verificando-o usando o código:
Integer a = Integer.valueOf("010101001", 2);
System.out.println(Integer.toString(a, 10));
inesperadamente obtemos algo diferente de -343...
169
Ah, que bom que uma vez, em uma aula de programação em C, de alguma forma ouvi brevemente algo sobre o dígito do sinal em números inteiros. Depois de pesquisar um pouco no Google, agora posso explicar que tipo de animal é esse. Negação bit a bit - por que então - 2Na verdade, há uma imprecisão no artigo, o que é confuso. Se verificarmos com o código qual é realmente o resultado da inversão do número 342:
int a = 342;
System.out.println(Integer.toBinaryString(~a));
então veremos um resultado ligeiramente diferente
1111111111111111111111010101001
Porque isto é assim? O problema é que uma variável não pode simplesmente conter 101010110; na verdade, ela é armazenada como
000000000000000000000101010110
Afinal, uma variável int ocupa 4 bytes, ou seja, 32 bits - 32 células de memória. Após a inversão, absolutamente todos os números mudam, ou seja, e zeros iniciais "aparados". Agora vem a parte divertida. Como na representação binária o sinal + ou - na frente de um número não pode ser armazenado, há um truque: o primeiro bit é realmente responsável pelo sinal e é precisamente o bit de sinal . E todos os números são armazenados de acordo com esta lógica: os números de 00...000 a 01...111 são positivos, começando em 0 (ou seja, de 0 a 2147483647) e começando em 10...000 a 11...111 são negativos, começando do menor e terminando em -1 (ou seja, -2147483648 a -1).
00000000000000000000000000000000 = 0
01111111111111111111111111111111 = 2147483647
10000000000000000000000000000000 = -2147483648
11111111111111111111111111111111 = -1
E então você pergunta: “Ok, Navalny, vamos acreditar em você, mas por que você decidiu que este é o palácio dele”, mas como é que é -343 com tudo isso? É muito simples. Podemos simplesmente calcular isso manualmente. Se “cortarmos” (ou substituirmos por 0) o primeiro bit da versão binária do número resultante 342 ( 1111111111111111111111111111111111111010101001 ) e retorná-lo à forma decimal.
String s = "01111111111111111111111010101001";
System.out.println(s + " = " + Integer.toString(Integer.valueOf(s, 2), 10));
então nós entendemos isso
0111111111111111111111010101001 = 2147483305
Na verdade, aqui não apenas “cortamos” 1 no início, mas subtraímos 1000000000000000000000000000000 deste número. Agora vamos adicioná-lo novamente, mas na forma decimal. O que veremos:
~342 =
11111111111111111111111010101001 =
//в двоичном виде//
01111111111111111111111010101001 +
10000000000000000000000000000000
=
//в десятичном виде//
-2147483648 + 2147483305 = -343
Aqui está o número obrigatório -343 :) Pessoal, esse é meu primeiro post aqui, por favor curtam se gostaram e foi informativo (quero muito colecionar todas as conquistas 😄) Vocês podem ler mais sobre esse assunto aqui: Boa sorte a todos e obrigado pela atenção)
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION