sábado, 18 de agosto de 2012

Pipe igual?

Olá povo,

Recebi um email com uma dúvida simples, mas interessante sobre Java, então resolvi posta aqui. O "|" (chama-se pipe ou popularmente "barra-em-pé") representa o operador OR binário. Quando utilizamos || (dois pipes) em uma expressão booleana, se a primeira for verdadeira, ele nem avalia a segunda.
boolean a = true;
int x = 0;
if (a == true || ++x > 0){
   // O valor de x não mudará
}
x continuará zero, pois a segunda expressão não será avaliada.
Mas quando utilizamos o operador em uma atribuição, estamos fazendo uma operação binária de OR.
int a = 2; // Em binário 00000010
int b = 4; // Em binário 00000100

// Vai ativar os bits de "a" (que é 2) em "b"
// Logo, em binário, ficará 00000110 que é igual a 6
b |= a; 
Você pode se perguntar: "em que isso influencia?" ou ainda "onde vou usar isso?". Essa abordagem é muito usada quando vc quer que uma propriedade possa assumir uma combinação de valores. Por exemplo, uma fonte pode ser bold, itálico e/ou sublinhado.
int bold = 1;      //00001
int italic = 2;    //00010
int underline = 4; //00100
Pra deixar uma fonte, itálico e sublinhada, usaríamos:
int fonte = bold | underline; // 00101 = 5
Aí você pode perguntar: qual a diferença entre isso e o + ? É que quando você usa o OR, se o valor já estiver setado, ele não é alterado. Continuando com o exemplo acima:
// ao invés de usar
fonte += bold; 
// igual a 6 (não seria o que queremos)

// usamos
fonte |= bold; 
// como o primeiro bit já está como 1, fonte continua 5
Já para checar se uma das opções da fonte está habilitada, usamos o operador &.
// assumindo que fonte = 5 = 00101
if (fonte & bold != 0){
  // fonte é negrito
}
Fui claro? :)

4br4ç05,
nglauber

Um comentário:

Anônimo disse...

Boa dica!