Ajuda pra entender operador de shift <<

10 respostas
ricardospinoza

Olá povo. fiquei curioso com um trecho de código, porém não saquei mto a ideia.
Pelo que vi na web rola um deslocamento bit de uma lado para o outro - mas não entendi como isto funciona.

int numero=-3; //numero vale -3 numero=numero&gt;&gt;1; //numero vale -2 numero=numero&lt;&lt;1; //numero vale -4 numero=numero&gt;&gt;&gt;1; //numero vale [telefone removido] numero=numero&lt;&lt;1; //numero vale -4

se alguém puder dar uma luz ai.

tks

10 Respostas

Eric_Yuzo

Pra entender estes operadores é preciso analisar os bits dos números.

Dê uma olhada nestes links:
http://www.guj.com.br/java/255881-operadores-de-shift
http://devsv.wordpress.com/2012/04/13/op-bitwise-java/

ricardospinoza

Gracias Eric, vou ler os links :slight_smile:

rmendes08

Execute esse código, talvez lhe esclareça:

public class BitShift {
	public static void main(String[] args) {
		int num = 0x00000fff;
		
		for(int i = 0 ; i < 33 ; i++){
			printBinary(num);
			num <<= 1;
		}
	}

	private static void printBinary(int num) {
		String bin = Integer.toBinaryString(num);
		bin = String.format("%32s", bin).replace(' ', '0');
		System.out.println(bin);
	}
}
ricardospinoza

rmendes08, obrigado pelo exemplo, rodei e gerou a saída:

11111000000000000000000000000000
11110000000000000000000000000000
11100000000000000000000000000000
11000000000000000000000000000000
10000000000000000000000000000000
00000000000000000000000000000000

Ai ficou evidente que ele deslocou os zeros pra esquerda.

Só resta, a saber qual a aplicabilidade deste tipo de recurso, pq a surgiu a dúvida depois que vi os caras fazendo isto em um código e não ficou entendível, imagino que este recurso tenha um objetivo bem matemático, mas tem termos práticos não sei se é usado pelo povo.

rmendes08

Operações a nível de bits são uma otimização e tanto quando comparadas a operações sobre objetos, por exemplo. Um exemplo bem prático é a codificação de dados binários para Base64. Geralmente, algoritmos de criptografia e hashing também usam bastante operações no nível dos bits.

E

Bom, é usado em criptografia - não é usado em contabilidade e controle de estoque :slight_smile:

ricardospinoza

Entendi a idéia. obrigado pessoal

ViniGodoy

Operadores assim são muito usados em processamento de som e imagem.

Se quiser ver um uso interessante:

O código fonte está dentro da imagem do GUJ. :slight_smile:

E

Uma coisa que é implementada em algumas linguagens e acho mais simples de entender que os operadores de shift (<<, >>, >>>) e mask (&, |, ~) é o campo de bits.

Em C existem, por exemplo, os “bit fields”. Exemplo (tirado de http://publications.gbdirect.co.uk/c_book/chapter6/bitfields.html ) :

struct {
      /* field 4 bits wide */
      unsigned field1 :4;
      /*
       * unnamed 3 bit field
       * unnamed fields allow for padding
       */
      unsigned        :3;
      /*
       * one-bit field
       * can only be 0 or -1 in two's complement!
       */
      signed field2   :1;
      /* align next field on a storage unit */
      unsigned        :0;
      unsigned field3 :6;
}full_of_fields;

O compilador deve, nesse caso, usar os shifts e masks adequados para montar e desmontar os valores.

Em Ada há o “packed array of boolean” mas nesse caso você não consegue definir campos com mais de 1 bit.

ricardospinoza

Legal, mto show o exemplo. já deu pra ter uma idéia do potencial e aplicabilidade.
O dia que eu precisar fazer algo assim será algo mto emocionante!!! :slight_smile:

Criado 28 de junho de 2012
Ultima resposta 29 de jun. de 2012
Respostas 10
Participantes 5