Sitemap

Pipe igual?

2 min readAug 19, 2012

--

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

Get Nelson Glauber’s stories in your inbox

Join Medium for free to get updates from this writer.

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

--

--

Nelson Glauber
Nelson Glauber

Written by Nelson Glauber

Android Developer. Google Developer Expert for Android/Kotlin. Author of “Dominando o Android”.