Operador ~

E ae galera tudo bem ?

Bom estou com dúvida a respeito do operador de troca de bits.

É o seguinte as operações de troca de bits são aplicada as int, certo ?

int a=1;
System.out.println(~a);

Me respondam o seguinte como a VM chegou ao valor -2 ?

Sabemos que o valor 1(decimal) no valor binário é 1. Quantos bits ele pega para fazer a conversão ?

 em binário considerando os 32 bits o 1 é :
  00000000000000000000000000000001

  para fazer a conversão ele usa todos os bits ? Ficando 

  11111111111111111111111111111110. Como é que este número pode ser -2 ?

  Na prova eu tenho que usar quantos bits para fazer a conversão.

 por exemplo eu teria que representar o 1 assim : 001 e fazer a conversão destes 3 bits ?

ficando 110 e o bit mais significativo é o do sinal ?   

Por exemplo 5 = 0101 e ~5= ? Como seria sua representação em Bin ?

Não sei se fui claro.

Só para ajudar ~5 é igual -6.

 Vlw.

Estude “complemento de 2” (se não achar isso em português, tente “two’s complement”) para entender porque é que -2 é representado (quando usamos um int de 32 bits) por 11111111111111111111111111111110.
(De fato, se você interpretasse o número acima como um inteiro sem sinal, obteria o valor em decimal 4294967294, como pode ser comprovao usando a calculadora do Windows em modo científico).

então eu devo utilizar a conversão de bits sempre utilizando os 32 bits ?

E depois converter estes 32 bits para o seu falor final ?

Bom raphael eh o seguinte o operador ~ (complemento) serve para inverter os bits - isso eu percebi que vc jah sacoW-Respondendo as seus perguntas

1- Como saber que o número em binário a seguir eh -2 ?
bom pra descobrir o valor de um número binário negativo vc deve inverter os bits
1111 1111 1111 1111 1111 1111 1111 1110 - primeira representação

0000 0000 0000 0000 0000 0000 0000 0001 - invertendo os bits

após a inversão dos bits vc deve somar 1 resultado:

0000 0000 0000 0000 0000 0000 0000 0010
pronto obteve o dois positivo, depois eh soh aplicar o sinal.

OBS: lembrando que o primeiro 1 se tornou 0 pq um e um somando vc obtem 0.

2- Na prova eu tenho que usar quantos bits para fazer a conversão ?
Sempre faça a conversão usando os 32 bits no caso de inteiros, 16 se for short e 8 se for bit (sempre atento ao ultimo bit da esquerda que eh o bit de sinal).

bom agora aplicando a mesma metodologia da primeira resposta pra esclarecer sua ultima duvida…vamos lah

0000 0000 0000 0000 0000 0000 0000 0101 - 5 binário positivo

aplicando o operador ~ (complemento) ficaria assim:
1111 1111 1111 1111 1111 1111 1111 1010

agora para descobrir o que significa o número binario obtido acima:
-primeiro invertemos os bits-
era assim: 1111 1111 1111 1111 1111 1111 1111 1010
fica assim: 0000 0000 0000 0000 0000 0000 0000 0101
depois adicionamos 1 e obtemos 6 positivo em binario:
0000 0000 0000 0000 0000 0000 0000 0110
por ultimo aplicamos o sinal. pronto o -6 tão cobiçado…
espero que tenho ajudado…qualquer duvida pode perguntar raphael…
abraço :smiley:

Excelente explicação Vinicius! Deu uma MINI aula! :-)))))

Só completando…

SEMPRE lembrem-se que se o número em binário começar com 1, ele é negativo, se começar com 0, ele é positivo!

Para encontrar que número negativo é, encontre o positivo dele (como o Vinicius falou) e só colocar “-” (menos) na frente!

[]'s Tjmm.

Valeu Vinícios, boa explicação.

Então para acabar com este assunto, vamos a outro exemplo agora partindo de um número negativo e aplicando o operador ~

Por exemplo o número -4.

Em binário sabemos que o -4 é assim
1111 1111 1111 1111 1111 1111 1111 1100 = -4

Aplicando o ~(-4), temos

0000 0000 0000 0000 0000 0000 0000 0011 = 3

Como soubemos que o valor acima tem o seu bit mais significativo da esquerda igual a zero sabemos que ele é positivo, e a transformção fica fácil.

Estou certo ?

Ats Raphael Nascimento.

Eh isso mesmo!!! Eh tudo questão de inverter os bits e quando o bit da extrema esquerda for 1 significa que o número será negativo então devemos aplicar a conversão (aquela vista acima).
:mrgreen: :mrgreen:

Ah soh mais uma coisa… como saber a representação de -4 primeiro bom uma maneira simples…usar a representação positiva:
representação de 4 em binário
0000 0000 0000 0000 0000 0000 0000 0100 4 binário
invertemos os bit´s
1111 1111 1111 1111 1111 1111 1111 1011
adicionamos 1:]
1111 1111 1111 1111 1111 1111 1111 1100 :arrow: pronto -4 (int) em binário.

[quote=Java Vinicius Machine]Ah soh mais uma coisa… como saber a representação de -4 primeiro bom uma maneira simples…usar a representação positiva:
representação de 4 em binário
0000 0000 0000 0000 0000 0000 0000 0100 4 binário
invertemos os bit´s
1111 1111 1111 1111 1111 1111 1111 1011
adicionamos 1:]
1111 1111 1111 1111 1111 1111 1111 1100 :arrow: pronto -4 (int) em binário.[/quote]

Perfeito!

[]'s Tjmm.

OI PESSOAL!!

Para quem vai fazer a prova, encontrei uma dica bem legal na especificação:

At run time, the value of the unary logical complement expression is true if the operand value is false and false if the operand value is true.[c
Onde:
~5 = (-5)-1 = -6
~(-4)=-(-4)-1= 3

:wink:

[quote=AngelaVenturi]OI PESSOAL!!

Para quem vai fazer a prova, encontrei uma dica bem legal na especificação:

At run time, the value of the unary logical complement expression is true if the operand value is false and false if the operand value is true.[c
Onde:
~5 = (-5)-1 = -6
~(-4)=-(-4)-1= 3

:wink: [/quote]

Muito interessante Angela. É uma dica muito valiosa mesmo pra quem vai fazer o exame! :thumbup: