Conversão byte pra int

Pessoal, a fim de entender como funcionam os tipos de dados, estudei bastente, mas msm assim me deparei com um código que por mais que eu tente, está difícil entender o funcionamento, e espero que me ajudem:

public class CalcIt { public static void main(String[] args) { byte bd = 12; // 0000 1100 byte be = 9; // 0000 1001 bd = (byte)(bd | be); } }

Sei que o tipo byte, é para números inteiros entre -128 e 127, e não entendo pq a operação acima resulta em 13.
Na vdd não sei tb como o operador | age exatamente, li que ele serve como comparador de tipos, mas nesse caso ele me parece realizar uma soma entre os nros.

Enfim, com meus próprios estudos não cheguei à conclusão do pq a operação deu 13, alguém poderia explicar?
abraços

A operação | (OR) faz o OR de cada bit do dado.

Como você já passou os valores para binário é mais fácil entender:

12 = 0000 1100 
 9 = 0000 1001
------------------
__ = 0000 1101 = 13

Isso é porque você pega cada bit do primeiro número e o combina com o bit correspondente no segundo número.
0 | 0 == 0, qualquer outra combinação é 1.

E como é que ele faz uma soma? 12 + 9 = 21, e o resultado é 13, que não é uma soma coisa nenhuma.

entendi, não imaginava que o | agia desta forma, obrigado…
e aproveitando, este operador compara tipos, certo? mas ele compara bit a bit, só em comparação entre nros do tipo byte, ou ele faz essa comparação bit a bit em todos os tipos?

e mais uma coisa, qual a finalidade de se fazer essa comparação?
pq eu usaria em um programa esse tipo de coisa?

[quote=bourne]entendi, não imaginava que o | agia desta forma, obrigado…
e aproveitando, este operador compara tipos, certo? mas ele compara bit a bit, só em comparação entre nros do tipo byte, ou ele faz essa comparação bit a bit em todos os tipos?[/quote]

O operador | , se você viu a documentação, funciona para os tipos: byte, int, short, char e long.

Ele também funciona para o tipo boolean; nesse caso, false | false == false, qualquer outra combinação == true.

Você usa isso em alguns programas que precisam retornar vários valores booleanos (por exemplo) em um único valor de retorno, sem ter de usar um array de boolean. Isso é a típica “escovação de bits”.

Operações sobre bits pode parecer um absurdo no mundo OO dos PC’s, mas não se pode esquecer que Java também é usado para dispositivos com recursos limitados de memória e processamento.

Eu uso Java p/ comunicação (Sockets) com equipamentos de automação, relógio ponto, controle de acesso… Uso mto esse tipo de coisa. Em mtos casos o equipamento me manda informaç~eos como porta 1 aberta, porta 2 fechada, porta 3 fechada, cada status desses estão num bit… Uso mto operação de bits… Por exemplo, sei q o BIT 0 é a porta 1. como sei se a porta tá aberta ou fechada?! pesquise sobre BITWISE:

if(b & 0x01 != 0) { //se vier algum numero aqui, qr dizer q o bit 0x01 está setado, pois a logica & só dá verdadeiro se ambos os bits estiverem setados...
  syso("Porta 1 Aberta");
} else {
  syso("Porta 1 Fechada");
}

legal, é importante trabalhar com esses tipos, pois o consumo de memória é menor
realmente agora num faz mta diferença, pois neste ambiente de aprendizado, geralmente com eclipse é tudo mto rápido
mas entendi a diferença e importancia da utilização destes tipos
obrigado pessoal