Certificação - Duvida <<, >> e >>>  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
duardor
Virtual Machine Man
[Avatar]

Membro desde: 04/12/2002 16:26:48
Mensagens: 552
Localização: BRAZIL
Offline

Ae galera
Estou me preparando para fazer o exame de certificação em JAVA (Programador) daí eu me deparei com um assunto um pouco confuso . São os tais operadores de shift <<, >> , >>>
Alguem tem um bom material sobre eles? Queria ver também o seu uso prático...
Acho que seria de grande valia um artigo/tutorial sobre o assunto aqui no site do GUJ...
Abraços!

Eduardo Rodrigues
Belo Horizonte - MG
[Email] [MSN] [ICQ]
mlopes
JavaTeenager
[Avatar]

Membro desde: 18/11/2002 11:01:01
Mensagens: 163
Localização: Alemanha
Offline

Fala,

Bom, eu posso te dizer o básico.

O shift >> na prática, devide o número por 2 elevado ao segundo param.

por exemplo:

4 >> 1 = 2
4 >> 2 = 1

O q acontece com os bits ???

4 = 0100

shift 1

0100 >> 0010

shift de novo

0010 >> 0001

Note que o sinal se mantem, se fosse um valor negativo, esse se manteria.

Note tb que o valor minimo para negativos é -1 e não 0. -4 >> 5 = -1 mas 4 >> 5 = 0;

O shift << multiplica por dois.

2 << 1 = 4
2 << 2 = 8

Mesma coisa.... coloque zeros do lado esquerdo.

Nota: se vc fizer por exemplo 10 >> 33, o compilador era otimizar para:

10 >> 33 % 32 => 10 >> 1. PQ???? Isso é uma otimização antiga que fizeram em processadores e q não vem ao caso descutir aqui.

Então, lembre-se int tem 32 bits, por issofaz-se mod 32, se for byte, faça mod 8...etc...

Agora o especial >>> este faz a mesma coisa q o >> mas ao invés de manter o sinal, ele inclui zeros a esquerda.

.... bom é isso. Sou meio ruim em explicar mas acho que da pra dar uma praticada com o seu próprio código. Tente usar valores como Integer.MAX_VALUE.... teste até entender.

[]'s

Marco.

Marco Lopes

----------------------------------------------------------
Pássaro que cedo madruga....
... porém o segundo rato é quem pega o queijo
----------------------------------------------------------
[Yahoo!] [MSN]
mlopes
JavaTeenager
[Avatar]

Membro desde: 18/11/2002 11:01:01
Mensagens: 163
Localização: Alemanha
Offline

OOPs...

Para o << deve-se colocar zeros a direita.... foi mal.

[]'s

Marco Lopes

----------------------------------------------------------
Pássaro que cedo madruga....
... porém o segundo rato é quem pega o queijo
----------------------------------------------------------
[Yahoo!] [MSN]
Elvis.The.Pelvis
JavaGuru
[Avatar]

Membro desde: 18/12/2002 17:45:34
Mensagens: 220
Localização: Recife/PE
Offline

Só uma coisa.
Os operadores <<, >> e >>> só trabalham com ints ou longs. Se vc for usar com byte, ele será convertido para um int e o %32 (ou %64) continua sendo aplicado.


Se não fosse o C, até hoje estaríamos programando em BASI, PASAL e OBOL.
Elvis.The.Pelvis é Daniel Freitas
[Email] [WWW] [MSN]
Carlos H
JavaTeenager
[Avatar]

Membro desde: 05/11/2002 13:07:13
Mensagens: 196
Localização: Jaraguá do Sul - SC
Offline

Olá duardor

Complementando as explicações dos colegas:

Os operadores de shifting são utilizados em algumas técnicas mais avançadas, incluindo mascaramento de bits por exemplo.

Para você REALMENTE entender o porque da existência destes operadores, você precisa entender o que acontece, antes de mais nada, você precisa conhecer um pouco sobre números binários. (Estou falando de matemática mesmo).

Cada número é representado por um padrão de bits, vamos pegar um byte para facilitar, por exemplo o número 5 é representado desta forma.

00000101

Como em java, todos os tipos primitivos possuem extensão de sinal (podem ser positivos ou negativos) os bits mais significativos indicam que o valor é positivo (0 neste caso).

Os operadores >> e << movem os bits para a direita e para a esquerda (respectivamente) respeitando o sinal do valor (positivo, que é 0 ou negativo, que é 1) . O operador >>> sempre move os bits para a direita e SEMPRE coloca zeros à esquerda.

Exemplo:

5 >> 1 (move uma posição para a direita)
Resultado: 00000010

Note que o '1' é perdido....

O assunto é um pouco vasto... mas, espero ter contribuído...qualquer dúvida, estamos ai

Carlos H.
Sun Certified Programmer
Núcleo de Informática UNERJ
Centro Universitário de Jaraguá do Sul
[ICQ]
duardor
Virtual Machine Man
[Avatar]

Membro desde: 04/12/2002 16:26:48
Mensagens: 552
Localização: BRAZIL
Offline

Agradeço aos colegas , era mais ou menos o q eu imaginava mesmo... Eu conheço binarios sim hehehehe To no sexto periodo do curso de ciencia da computacao , se nao conhecesse me matava hehehehe
Alguem conhece alguma questao real do exame de certificacao que cobre esses operadores?
dá pra postar aqui?
Bom valeu galera!!!

Eduardo Rodrigues
Belo Horizonte - MG
[Email] [MSN] [ICQ]
mlopes
JavaTeenager
[Avatar]

Membro desde: 18/11/2002 11:01:01
Mensagens: 163
Localização: Alemanha
Offline

Ola

Para mim apareceu uma só . Colocaram uma lista de operações e pediram para eu marcar quais duas eram equivalentes....

Não lembro todas mas tinha:

3 << 2

e

3 * 4

Fácil.

[]'s

Marco Lopes

----------------------------------------------------------
Pássaro que cedo madruga....
... porém o segundo rato é quem pega o queijo
----------------------------------------------------------
[Yahoo!] [MSN]
Carlos H
JavaTeenager
[Avatar]

Membro desde: 05/11/2002 13:07:13
Mensagens: 196
Localização: Jaraguá do Sul - SC
Offline

Oi duardor

Foi mal... hehehe mas sabe como é... escrevi pensando nos demais usuários lendo

Carlos H.
Sun Certified Programmer
Núcleo de Informática UNERJ
Centro Universitário de Jaraguá do Sul
[ICQ]
marciolx
GUJ Master
[Avatar]

Membro desde: 28/01/2003 15:38:00
Mensagens: 1090
Localização: Piracicaba/SP
Offline

posso afirmar que aplicando o operador >>> sobre um número negativo vai resultar sempre em um número positivo muito grande?

@ till %. Simple.
[Email]
Bani
JWizard
[Avatar]

Membro desde: 13/10/2002 23:17:37
Mensagens: 2443
Localização: São Paulo
Offline

Não necessariamente muito grande.
Um int tem 32 bits, e em um int negativo o bit mais da esquerda é 1.
Quando você começa a "empurrar" esse 1 para os bits significativos, se empurrar só um pouco vai dar um número muito grande. Porém, quanto mais você "empurrar" ele (até um limite de 32), menor vai ficando o resultado.
Ex.: -10 >>> 30 = 3

~ Site da Bani ~
marciolx
GUJ Master
[Avatar]

Membro desde: 28/01/2003 15:38:00
Mensagens: 1090
Localização: Piracicaba/SP
Offline

ok, obrigado

@ till %. Simple.
[Email]
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team