Operadores bit a bit << >> e >>>  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
JBoy__
Java Ninja
[Avatar]

Membro desde: 02/04/2003 16:07:49
Mensagens: 269
Localização: Copenhagen/Denmark
Offline

Opa... alguem podia dar uma mao ?
Essa parada de bit mais importante antes da mudanca dos bits do operador >> ta me deixando um pouco confuso
alguem me ajuda ?

Valeu e abracos.

This message was edited 1 time. Last update was at 05/02/2009 14:59:36

louds
Moderador
[Avatar]

Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline

os operadores bit a bit <<, >> e >>> fazer deslocamento

vc conhece notacao binaria de numeros ne?
e representacao de numeros negativos? java usa complemento de 2.

contando que o bit significativo (maior valor) fica a esquerda temos:

13 (1101)

13 << 2 -> 52
1101 -> 110100

o >> é deslocamento logico, preenche sempre com zero a esquerda
o >>> é deslocamento matematico, preenche sempre o sinal a esquerda

13 >> 2 - > 3
13 >>> 2 -> 3
1101 -> 11

ok, mas pro numero negativo -5 o resultado muda, primeiro vamos calcular a representação dele:
5 -> 0101
-5 -> 1010 + 1 -> 1011

1011 (-5) >> 2 -> 0010 (2)
1011 (-5) >>> 2 -> 1110 (-2)

alguma duvida?
[ICQ]
JBoy__
Java Ninja
[Avatar]

Membro desde: 02/04/2003 16:07:49
Mensagens: 269
Localização: Copenhagen/Denmark
Offline

tipo... o que eu consegui entender ate agora onde eu li e que os operadores << e >>> eles adicionam 0 aos novos bits correto ? e o operador >> ele condiciona o novo bit ao bit mais relevante antes da mudanca. Agora vem a duvida realmente... como eu posso descobrir o bit mais relevante nessa mudanca e outra sera que vc tem mais exemplos pra colocar aqui ? ja me ajudaram bastante.

obrigado
Bani
JWizard
[Avatar]

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

Acho que o que está te confundindo é o bit do sinal...
Se o número é positivo, o bit mais da esquerda é 0, e se é negativo, é 1. Isso porque os inteiros em Java são "signed", ou seja, o bit da esquerda serve simplesmente para representar o sinal.
Dessa forma, se o número for positivo, ao fazer o deslocamento ele vai preencher com 0s a esquerda, e se for negativo, vai preencher com 1s

~ Site da Bani ~
louds
Moderador
[Avatar]

Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline

bani, não é exatamente isso, pq java usa complemento de 2, mas sim, sempre que tivermos o bit mais significativo setado, ele é negativo.

Cada tipo inteiro do java possui 1 tamanho em bits fixo:

long -> 64
int -> 32
short -> 16
byte -> 8
(vou omitir o tipo char pra nao complicar as coisas)

ok?
codigo binario funciona feito o decimal, mas so tem digitos 0 e 1
o numero:
1234
nao é a mesma coisa que
1 * 1000 +
2 * 100 +
3 * 10 +
4 * 1
o 1 é o bit mais significativo e o 4 o menos.

a mesma coisa vale pra representacao binaria:

00001001 (9 em decimal)
o 1 a direita é o mais significativo

como funciona conversao entre binario e decimal?
sem entrar no merito da teoria, como regra pratica vc faz assim:
vai da direita pra esquerda somando os numeros das varias casas da seguinte forma:
d * 2 ^ i
onde:
d é o digito na casa em questão
i é a posição do digito no número, conte da direita pra esquerda e comece no zero.
^ é pra exponenciação
entao
00001001 fica:
1 * 2 ^ 0 = 1
0 * 2 ^ 1 = 0 +
0 * 2 ^ 2 = 0 +
1 * 2 ^ 3 = 8 + (=9)
....


Muito bem, já da pra explicar os operadores de shift.
Esses 3 operadores funcionam deslocando, 'empurrando', os bits para a esquerda ou para a direita.

nosso exemplo 1 byte, tem 8 bits lembra?, com o numero 9 fica 00001001
vamos ver oq acontece com os varios shifts:

00001001 << 1 = 00010010
00001001 << 2 = 00100100
00001001 << 3 = 01001000
00001001 << 4 = 10010000
00001001 << 5 = 00100000
00001001 << 6 = 01000000
00001001 << 7 = 10000000
00001001 << 8 = 00000000

00001001 >> 1 = 00000100
00001001 >> 2 = 00000010
00001001 >> 3 = 00000001
00001001 >> 4 = 00000000

00001001 >>> 1 = 00000100
00001001 >>> 2 = 00000010
00001001 >>> 3 = 00000001
00001001 >>> 4 = 00000000

Ate aqui tudo bem? Ok, mas >> e >>> fazem a mesma coisa não? Aparentemente sim, a diferença é sutil, mas fundamental.

Primeiro a explicação do pq, se tiver notado o << vai multiplicando o numero por 2, entao 10 << 1 = 10 * 2 = 20, 10 << 2 = 10 * 2 * 2 = 40
e da mesma forma >> e >>> vao dividindo: 16 >> 1 = 8, 16 >> 3 = 2.

Java pode guardar numeros negativos num byte tambem, porem esse esquema que mostrei agora nao resolve isso, pq so guarda numeros positivos e o zero. É ai que entra a notação de complemento de 2, é a forma com que todas maquinas de hoje em dia usam pra representar numeros negativos, a formula é bem simples:

dado o numero x positivo vc inverte os bits (quem era 0 vira 1 e vice-versa) e depois soma 1, pronto vc tem -x. Ex:

10 = 00001010
invertemos os bits:
11110101
somamos 1
11110110
pronto, -10 em binario é 11110110 (isso quando tamos usando 8 bits, senao vc extende com 1's a esquerda)

aqui que aparece a diferença entre >> e >>>.
esses operadores vao 'empurrar' os bits a direita. Porem como vc pode imaginar, fazer simplemente isso aquela propriedade de ir dividindo o numero por 2 nao vale mais pq:
11110110 (-10) >> 1 =
01111011 não é -5 e sim 123.
Pra isso serve o >>>, ele vai preencher a esquerda com o bit do sinal, ai vai dar a conta que voce esperava:
11110110 >>> 1 =
11111011 = -5

Pra nao ficar nenhuma duvida:

0110 >>> 1 -> 0011
1000 >>> 1 -> 1100

espero ter exclarecido sua duvida.
[ICQ]
saviod2
What is classpath?
[Avatar]

Membro desde: 09/05/2008 10:26:13
Mensagens: 5
Localização: teresina-pi
Offline

louds explicação mt boa.
Não só tirou a duvida do
JBoy__ como a minha também.
vlw

Sávio Mota
[Yahoo!] [MSN]
raphaelwct
Thread.start()
[Avatar]

Membro desde: 10/09/2008 22:56:38
Mensagens: 28
Localização: Bento Ribeiro - Rio de Janeiro
Offline

Ótima a explicação, muito completa e clara.
Tirou todas minhas dúvidas.

Write once, run everywhere !
[Email] [MSN]
rodrigo_rosalin
Thread.start()

Membro desde: 25/11/2008 20:00:40
Mensagens: 32
Offline

louds wrote:
...
nao é a mesma coisa que
1 * 1000 +
2 * 100 +
3 * 10 +
4 * 1
o 1 é o bit mais significativo e o 4 o menos.

a mesma coisa vale pra representacao binaria:

00001001 (9 em decimal)
o 1 a direita é o mais significativo

...

espero ter exclarecido sua duvida.



louds seria o bit 1 mais a esquerda o mais significativo.

This message was edited 1 time. Last update was at 05/02/2009 15:00:09

Giovanni Ritchie
Debugger
[Avatar]
Membro desde: 18/02/2009 22:52:30
Mensagens: 71
Localização: Rio de Janeiro
Offline

Embora o post seja muito antigo, creio q muita gente pode encontrar por ai e tentar se basear nele,.. excelente explicacao louds, mas tem um porem... vc acabou trocando, o operador >>> nao considera o sinal e sim o >> que considera, entao aqui
Pra isso serve o >>>, ele vai preencher a esquerda com o bit do sinal, ai vai dar a conta que voce esperava:
11110110 >>> 1 =
11111011 = -5

Pra nao ficar nenhuma duvida:

0110 >>> 1 -> 0011
1000 >>> 1 -> 1100


seria o inverso nos sinais
abrs

Write Once, Run Anywhere
[Yahoo!] [MSN]
dudu795
Thread.start()

Membro desde: 31/08/2009 20:55:17
Mensagens: 27
Localização: Dois Vizinhos
Offline

Boa tarde, estou tentando intender este negócio de modificadores binários, e encontrei este tópico, entendi bem, exceto a parte de somar 1 no valor abaixo, por exemplo, como é feita detalhadamente esta soma de 1 que transformou 11110101 em 11110110?

10 = 00001010
invertemos os bits:
11110101
somamos 1
11110110
pronto, -10 em binario é 11110110 (isso quando tamos usando 8 bits, senao vc extende com 1's a esquerda)


Obrigado!
[MSN]
Giovanni Ritchie
Debugger
[Avatar]
Membro desde: 18/02/2009 22:52:30
Mensagens: 71
Localização: Rio de Janeiro
Offline

Boas, blz?

Entao para chegar de 11110101 em 11110110 adicionando 1 é simples.

11110101
+ 1

1 + 1 = 0 pendura 1

entao teremos ,
agora adiciona 1 pendurado ao penultimo zero

11110100
+ 1

teremos

11110110 = resultado final

Abraço!

Write Once, Run Anywhere
[Yahoo!] [MSN]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team