Manipulação de bits - Comportamento inesperado

2 respostas
C
public class BitOpers
{
	 
	 public static void main( String args[] )
     {
	 	/*Uma variável byte tem capacidade para 8 bits de dados e possui um bit para
	 	 *representação de sinal. Portanto, é capaz de endereçar valores de - ( 2 ^ 7 )
	 	 *até ( 2 ^ 7 ) - 1, em números inteiros, de - 128 até 127.
	 	 *Em bits:  -128 == 10000000
	 	 *          +127 == 01111111
	 	 */
	 	 
	 	 System.out.println( "Valor de A = 128" );
	 	 a = (byte) -128; // 10000000
	 	 
	 	 System.out.println( "Deslocando os bits de A  uma posição à direita ( a>>1)" );
	 	 a = (byte) ( (byte) a>>1 ); // 11000000 - Repare que o bit de sinal é preservado
	 	 System.out.println( Integer.toString( a ) );
	 	 
	 	 System.out.println( "Deslocando os bits de A mais uma posição à direita (a>>1)" );
	 	 a = ( byte ) ( (byte) a>>1 ); // 11100000
	 	 System.out.println( Integer.toString( a ) );
	 	 
	 	 int b = 128;
	 	 System.out.println( "Deslocando os bits de A mais uma posição à direita, mas sem preservar o sinal" +
	 	 	" a>>>1" );
	 	 a = (byte) ( (byte) a>>>1 ); // 01111000 - O número torna-se positivo?
	 	 System.out.println( Integer.toString( a ) );	 	
	 }
}

Bom…isso me gera como saída:

Valor de A = 128
Deslocando os bits de A  uma posição à direita ( a>>1)
-64
Deslocando os bits de A mais uma posição à direita (a>>1)
-32
Deslocando os bits de A mais uma posição à direita, mas sem preservar o sinal a>>>1
-16

Não entendi o porquê do -16.

Quando eu faço a>>>1 não deveria dar 80?

Desde já agradeço…

2 Respostas

C

Ninguém? :roll:

Não acho nada a respeito…
Estou acreditando que o operador >>> se aplica apenas ao tipo int… embora eu não tenha lido em lugar nenhum algo que comprove isso.

A

Carnevalli,

Acho que você tá trocando os bits. :smiley:

neste posição:

a = (byte) ( (byte) a>>>1 ); // 01111000 - O número torna-se positivo?

O resultado vai ser -16(11110000). Pois você tinha na linha anterior -32 (11100000).
Observe a quantidade de zeros. 5 em -32 e 4 em -16.
Então a >>> 1 deslocou um bit.
O binário de 80 é 1010000.

No site da Sun diz isto:

Então ele só vai funcionar com int ou long por causa do resultado e depende do sinal também, lógico. Um test que fiz aqui pra ver se o resultado seria igual a (n >> s ) + (2<<~s) , uma vez que "a" é -32, negativo.

O resultado foi ((byte) ((byte)-32 >> 1 ) + (2<<~1)): [telefone removido] (1111111111111111111111111111000)

Ou seja, não vi nenhuma semelhança entre -16 para este aí… bom não converti tudo pra int pra ver o resultado…

Abraços,

Criado 22 de março de 2008
Ultima resposta 25 de mar. de 2008
Respostas 2
Participantes 2