| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2003 07:18:24
|
duardor
Virtual Machine Man
![[Avatar]](/images/avatar/18d8042386b79e2c279fd162df0205c8.jpg)
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 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2003 08:22:49
|
mlopes
JavaTeenager
![[Avatar]](/images/avatar/c3e26d423e3654fab1f76.jpg)
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
---------------------------------------------------------- |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2003 08:26:17
|
mlopes
JavaTeenager
![[Avatar]](/images/avatar/c3e26d423e3654fab1f76.jpg)
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
---------------------------------------------------------- |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2003 09:20:47
|
Elvis.The.Pelvis
JavaGuru
![[Avatar]](/images/avatar/c8a589523f35508a5d7ec.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2003 13:00:51
|
Carlos H
JavaTeenager
![[Avatar]](/images/avatar/c8f7b2be3dcdd4abcb34e.gif)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2003 21:59:16
|
duardor
Virtual Machine Man
![[Avatar]](/images/avatar/18d8042386b79e2c279fd162df0205c8.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/02/2003 09:49:43
|
mlopes
JavaTeenager
![[Avatar]](/images/avatar/c3e26d423e3654fab1f76.jpg)
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
---------------------------------------------------------- |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/02/2003 13:08:27
|
Carlos H
JavaTeenager
![[Avatar]](/images/avatar/c8f7b2be3dcdd4abcb34e.gif)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/04/2003 17:39:58
|
marciolx
GUJ Master
![[Avatar]](/images/avatar/58ae749f25eded36f486bc85feb3f0ab.jpg)
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/04/2003 19:12:37
|
Bani
JWizard
![[Avatar]](/images/avatar/6cdd60ea0045eb7a6ec44c54d29ed402.jpg)
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 ~ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/04/2003 13:01:25
|
marciolx
GUJ Master
![[Avatar]](/images/avatar/58ae749f25eded36f486bc85feb3f0ab.jpg)
Membro desde: 28/01/2003 15:38:00
Mensagens: 1090
Localização: Piracicaba/SP
Offline
|
ok, obrigado
|
@ till %. Simple. |
|
|
 |
|
|