links citados durante a aula
Especificação da linguagem Java
Operadores lógicos (bit a bit)
Nos computadores digitais atuais, podemos dizer que a representação interna dos números é binária, ou seja, números são armazenados na base 2. As operações lógicas bit a bit operam cada um dos bits dos números. São elas:
Lista de Operadores Lógicos bit a bit
~ & | ^
A operação ~ é unária e complementa o número bit a bit. A operação & é binária e faz um E bit a bit. A operação | é binária e faz OU bit a bit. A operação ^ é binária e faz OU exclusivo (XOU, ou XOR) bit a bit - nesta operação o resultado é 1 somente se os dois operandos são diferentes.
Para entender essas operações, comecemos com números de um bit. Eles podem assumir valores zero ou um. Construiremos tabelas com todas as possibilidades de operandos de um bit.
Não | E | OU | OU exclusivo | |||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
Para aplicar essas operações sobre números inteiros, temos que converter os números em sua representação binária, aplicar a operação bit a bit, a partir do bit menos significativo e converter o resultado de volta para decimal. Por exemplo: 19 & 6
2^4 | 2^3 | 2^2 | 2^1 | 2^0 | |||
A | 19 | 1 | 0 | 0 | 1 | 1 | |
B | 6 | 0 | 0 | 1 | 1 | 0 | |
S | 0 | 0 | 0 | 1 | 0 | 2 |
Outro exemplo: 19 | 6
2^4 | 2^3 | 2^2 | 2^1 | 2^0 | |||
A | 19 | 1 | 0 | 0 | 1 | 1 | |
B | 6 | 0 | 0 | 1 | 1 | 0 | |
S | 1 | 0 | 1 | 1 | 1 | 23 |
Outro exemplo: 19 ^ 6
2^4 | 2^3 | 2^2 | 2^1 | 2^0 | |||
A | 19 | 1 | 0 | 0 | 1 | 1 | |
B | 6 | 0 | 0 | 1 | 1 | 0 | |
S | 1 | 0 | 1 | 0 | 1 | 21 |
Há operadores de deslocamento bit a bit, que são listados abaixo, mas não serão apresentados agora.
Lista de Operadores de deslocamento bit a bit
<< >> >>>
Você pode perguntar por que operadores lógicos como esses são importantes. Há vários motivos, dentre eles, os componentes básicos para construção dos computadores funcionam desta forma. Conectando milhões destes componentes que construímos o microprocessador, memória, chipset,...
Operadores relacionais
Operadores relacionais são aqueles que testam uma relação, por exemplo a de igualdade, e retornam como resultado se essa relação é verdadeira ou falsa. São operadores relacionais em Java:
Lista de Operadores Relacionais
> <== <= >= !=
! && ||
O operador ! é unário, o restante é binário. Os da primeira linha da lista podem ser aplicados diretamente a variáveis e literais de tipo primitivo. Os da segunda linha servem para associar logicamente os da primeira, resultando em expressões mais complexas e poderosas.
12 == 12 // retorna true pois os números são iguais
12 <= 12 // retorna true pois um números é menor ou igual a ele mesmo
12 >= 17 // retorna false
17 < 17 // retorna false pois um número não pode ser menor que ele mesmo
5 > -3 // retorna true
5 != 7 // retorna true pois 5 é diferente de 7
Os operadores da segunda linha são NÃO, E e OU relacionais. Esses operadores se aplicam exclusivamente a operandos do tipo boolean. Relembrando, em Java, o tipo boolean só pode assumir dois valores: true ou false, se fizermos a correspondência true=1 e false=0, seu funcionamento é igual ao dos operadores lógicos bit a bit correspondentes.
Talvez o que há de mais poderoso e mais compicado a respeito dos operadores relacionais acontece quando ao invés de usar literais, usamos variáveis, e os nomes (identificadores) dessas variáveis são palavras com significado para nós. As expressões lógicas resultantes dessa combinação são o cerne do que entendi que os alunos daqui chamam de lógica de programação.
Exemplo 1
"Eu digo que ehIdoso quando a idade for maior que 65 anos."
O período acima pode ser escrito como uma expressão lógica em que o resultado é armazenado em ehIdoso e os operandos são idade e 65.
boolean ehIdoso=idade > 65
Exemplo 2
"Eu digo que naoEntra quando a idade for menor que 18 anos."
O resultado é armazenado em naoEntra e os operandos são idade e 18
boolean naoEntra=idade < 18
Podemos, a partir de naoEntra, escrever entra. Eu digo que entra quando naoEntra for falso.
boolean entra= naoEntra==false
Podemos escrever a mesma coisa dizendo: Eu digo que entra quando não naoEntra.
boolean entra= !naoEntra
Exemplo 3
"Eu digo que vaiChover quando a umidade for maior que 85% e a temperatura for maior que 27C."
O período acima pode ser escrito como uma expressão lógica em que o resultado é vaiChover e os operandos são umidade temperatura, 85 e 27. Vamos separar as operações relacionais:
a umidade for maior que 85% corresponde à expressão lógica umidade > 85.
a temperatura for maior que 27C corresponde à expressão lógica temperatura > 27.
As duas operações são "conectadas" por um e, que corresponde ao operador lógico &&. Logo obtemos:
boolean vaiChover=(umidade > 85) && (temperatura > 27)
Exemplo 4
"Eu digo que ehBixo quando estiverPintado"
O resultado é ehBixo, e os operandos? Este caso é um pouco mais complicado pois há informação implícita: estiverPintado é um operando - qual é o seu tipo e o que significa? Neste caso, convém definir que estiverPintado é um boolean, que vale true quando a pessoa estiver pintada e false quando a pessoa não estiver pintada. Há duas expressões equivalentes (e pode haver outras):
boolean ehBixo = estiverPintado
boolean ehBixo = estiverPintado==true
Exemplo 5
"Eu digo que tem poucaChance quando foiAtropelado e a idade for menor que 3 ou maior que 60 anos, ou se tem cancerOsseo."
Neste caso, a expressão é mais complicada, e a precedência das operações não é clara (pois na linguagem natural não há como especificá-la). Nesta expressão, numa análise superficial, só há uma ordem para as operações que faz sentido. Vamos perceber quando tentarmos escrever a expressão lógica:
foiAtropelado é um operando e vale true se o indivíduo foi atropelado, false caso não foi atropelado.
idade menor que 3 anos corresponde a idade < 3
idade maior que 60 anos corresponde a idade > 60
As duas expressões acima são conectadas or um OU, resultando em (idade < 3) || (idade > 60)
A expressão acima é conectada à primeira por um E, resultando em foiAtropelado && ((idade < 3) || (idade > 60)).
cancerOsseo é um operando e vale true se o indivíduo tem a doença, false caso não tenha. É conectado ao restante por um OU e o resultado é atribuído a poucaChance, o que resulta em:
boolean poucaChance = cancerOsseo || (foiAtropelado && ((idade < 3) || (idade > 60)))
Exercício 1
"Eu digo que ehBixo quando estiverPintado e o cabelo estiver meioRaspado e a roupa estiver cortada."
Nenhum comentário:
Postar um comentário