Dica para operadores >> e <<

3 respostas
ricardolecheta

não sei se é novidade para vcs, mas aí vai uma dica para saber o resultado de um deslocamento de bit:

250 >> 4 ???
250 << 4 ???

fórmula:

n >> shift é igual a: n / Math.pow(2, shift); //resultado: 15

n << shift é igual a: n * Math.pow(2, shift); // resultado: 4000

no exemplo o “n” é 250 e “shift” é 4

int n = 250;
int shift = 4;

System.out.println&#40;n &gt;&gt; shift&#41;;
System.out.println&#40;&#40;int&#41;&#40;n / Math.pow&#40;2, shift&#41;&#41;&#41;;
		
System.out.println&#40;n &lt;&lt; shift&#41;;
System.out.println&#40;&#40;int&#41;&#40;n * Math.pow&#40;2, shift&#41;&#41;&#41;;

3 Respostas

balrog

a dica é legal com certeza, só pra complementar:

16 << 5 = 16 * 25 = 512
16 >> 2 = 16 / 22 = 4
-16 >>> 2 = (-16 >> 2 ) + ( 2 << ~2 ) = 1,073,741,820

operador unário tbm tem formulas

bitwise
~x = (-x)-1
~7 = -7 -1 = -8

C

Ótimas dicas… vamos complementar:

Quando a qtd de bits a movimentar é igual ou maior que o bit-depth do tipo de dado a ser movimentado, então será aplicado a seguinte regra :
 BM  -&gt; bits a movimentar.
 BD  -&gt; bit-depth

 consideremos que BM é igual a 36 e que estamos lidando com um inteiro Java (32 bits), então o valor de BM terá de ser recalculado:
 BM = BM % BD

ou
BM = 36 % 32 --> serão movimentados 4 bits.

*** Um pega já conhecido é :

int i = -1;   // todos os bits da palavra estão ligados.
 i = i &gt;&gt;&gt; 32;
 System.out.println( i ); // o q é impresso ??

 A maioria  diria 0, pois se esquecem que segundo a regra acima, como o bit-depth de int é 32 , a qtd de bits a movimentar será 'ZERO' pois 32 % 32 é 0, e portanto o resultado a ser impresso é -1.
*** Outro pega manjado :

int i = 1;

i = i << 31;

i = i >> 31;

System.out.println( i );  // qual é a saida ??
Esse vai e vem nos bits nos confundem as vezes,  a 1º movimentação pega o bit menos significante e o movimenta para a extrema esquerda, isso faz com que o valor do inteiro fique negativo, e seu valor é -[telefone removido] , mas o que vale aqui é o sinal.
  A segunda movimentação atravessa toda a palavra ( 31 bits ) e como

o operador é signed-right todos os bits da palavra serão ligados.
Assim o valor da saida será -1.

[]'s
Cláudio Gualberto.

louds

cuidado quando usar esse macete do pow e >> para numeros negativos, os resultados podem ser diferentes pq o arredondamento com >> é feito em direcão a -infinito enquanto o outro é pelas regras do ieee 754.

Criado 1 de junho de 2003
Ultima resposta 1 de jun. de 2003
Respostas 3
Participantes 4