Duvida sobre o operador de inversao de bits ~

Ae galera
To com uma duvida…
seguinte
como age o operador de inversao de bits?
Por exemplo:
seja o numero 1 em binario (pra simplificar colocamos um byte)
10000001

Sendo que o digito mais significante eh o digito de sinal e assumindo que 1 eh positivo

se eu aplicar o operador de inversao de bit ficaria

01111110

ou seja algum numero negativo muito grande

mas ao fazer isso em um programa com esse codigo:

public class teste{ 
  static char staticArray[] = new char[5];
  public static void main(String[] args){ 
     byte x = 1;
	 byte y =(byte) ~x;
	 System.out.println(y);
  }
   
} 

ele imprime -2…
nao entendi… alguem pode me explicar?

A representacao binaria de “1” eh “01”. Ao inverter os bits, fica “10”, que eh “2” positivo. Porem, como o sinal eh trocado, todos os outros bits mais a esquerda, que antes eram “0”, viram “1”, tornando o numero negativo.

byte b = 1;
System.out.println(Integer.toBinaryString(b));
b = (byte)~b;
System.out.println(Integer.toBinaryString(b));

Rafael

entao ele nao vai inverter os bits 0 que estao mais a esquerda, com excecao do bit indicador de sinal???
eh isso?

Ele inverte todos os bits… “mais a esquerda” significa todos eles, nao somente um. Execute o programa para voce ver.

Rafael

[quote=“Rafael Steil”]Ele inverte todos os bits… “mais a esquerda” significa todos eles, nao somente um. Execute o programa para voce ver.

Rafael[/quote]
Mas rafael como eu disse:
Se sao todos bits entao
um byte tem 8 bits sendo q o de ordem mais alta eh o digito de sinal:
entao digamos 1 se o bit de ordem mais alta for 1 entao eh positivo
o numero “1” seria:
10000001
aplicando ~
01111110
q eh -2^21 =
-2097152

maos ao inves disso ele dah:
00000010 q eh o -2
os bits em amarelo
00[color=“yellow”]0000[/color]10 nao foram invertidos…
entao os bits que estao entre o bit de sinal e o primeiro bit 1 nao sao invertidos…
to errado?
agradeço sua ajuda

[color=“yellow”][/color][color="#444444"][/color]

Nao, nao… “1” eh negativo, “0” eh positivo. Voce esta confundindo. Depois, a operacao de inversao eh feita como se fosse um int neste caso, tanto que voce precisa do cast para byte para fazer a atribuicao de novo… entao, na verdade, voce esta trabalhando com um numero de 32 bits ( mas nao que isso interfira no resultado neste caso ).

Rafael

Eu nao to preocupado com o bit de sinal
To sim preocupado com os bits entre o bit de sinal e o primeiro 1 no valor original…
Tipo digamos entao que um inteiro tenha 4 bits(pra simplificar) e o bit de sinal eh + ou -
Entao 1 :
+001
Aplicando ~
-110
Que na verdade eh igual -5
entendeu???
se inverter todos os bits teria q funcionar assim…
me exoplica isso ai direito, como funciona nos bits…
valew
[/b]

Ola,

O 110 na verdade é -2. O java trabalha com complento de dois!!! (byte, short, int e long).

[]'s

Putz
Complemento de 2…
Eu vi isso no primeiro periodo da facu e depois nunca mais…
Como eh mesmo a teoria?

Ola

Na prática:

~i = -(i + 1)

O google acha bastante literatura sobre o assunto.

[]'s