Curso de Pascal
Operadores
Você está em: MarMSX >> Cursos >> Pascal
O objetivo dos operadores é realizar algum tipo de modificação ou conta em um ou mais operando. Ex:
Um operando:
Dois operandos:
Os operadores estão divididos em cinco categorias. As categorias são as seguintes, respeitando a ordem de precedência[1]:
- Sinal negativo com um operando.
- Operador lógico NOT.
- Operadores de multiplicação: *, /, div, mod, and, shl, shr.
- Operadores de adição: +, -, or, xor.
- Operadores relacionais: ., <>, <, >, <., >., in.
Operadores com o mesmo nível de precedência são avaliados da esquerda para a direita. As expressões dentro dos parêntesis são avaliadas primeiro, independente da ordem de precedência[1].
[1] Referência: Turbo Pascal Reference Manual, Version 3
Principais operadores e funções
Operador |
Descrição |
* |
Multiplicação.
Ex: 5*4 = 20. |
+ |
Soma. Ex:
5+4 = 9. |
- |
Subtração.
Ex: 5-4 = 1. |
/ |
Divisão.
Ex: 2/4 = 0.5. |
:= |
Associação.
Ex: a:=4. |
< |
Menor que. Ex: if salario < 2000 then. |
<= |
Menor ou igual que. Ex: if b <= 34 then. |
<> |
Diferente de. Ex: if nome <> 'MSX then. |
= |
Igual, em teste lógico. Ex: if a=5 then. |
> |
Maior que. repeat ... until j>15. |
>= |
Maior ou igual que. Ex: while k >= 4 do. |
and |
"E" lógico. Ex: if
(a>4) and (b<5). |
div |
Divisão
inteira. Ex: 5 div 4. |
in |
Inclusão.
Ver estrutura SET. |
mod |
Resto da
divisão. 4 mod 3. |
not |
Negação.
if not valido then. |
or |
"OU" lógico. Ex: if
(a>4) or (b<5). |
shl |
Shift left
(deslocamento de bits à esquerda). |
shr |
Shift right
(deslocamento de bits à direita). |
xor |
"Ou
exclusivo". Ex. if a xor b then. |
|
|
Aritméticos |
Descrição |
abs |
Elimina
sinal de número. Ex: abs(-5) traz 5. |
arctan |
Arco
tangente. Ex: arctan(0.5) traz 0.4636. |
cos |
Cosseno em
radianos. Ex: cos(1.4) 0.16997. |
exp |
Exponencial
neperiano (e elevado a n). Ex: exp(4). |
frac |
Retorna a
parte fracionária. Ex: frac(14.58) traz 0.58. |
int |
Retorna
parte inteira de número fracionário. |
ln |
Logaritmo
neperiano. Ex: ln(5). |
sin |
Seno. Ex:
sin(0.5). |
sqr |
Quadrado de
um número. Ex: srq(4) traz 16. |
sqrt |
Raiz
quadrada. Ex: sqrt(9) traz 3. |
|
|
Outros |
Descrição |
chr |
Retorna um caractere a partir do código ASCII. Ex: chr(72). |
ord |
Retorna o código ASCII de um caractere. Ex: ord('k'). |
round |
Arredonda um número. Ex: round(1.78) traz 2. |
trunc |
Trunca um número. Ex: trunc(1.78) traz 1. |
pred |
Obtém o número anterior. Ex: pred(4) traz 3. |
succ |
Obtém o próximo número. Ex: succ(4) traz 5. |
odd |
Retorna se um número é ímpar. Ex: odd(4) traz false. |
Exemplos
Exemplo 1
var a,b : integer;
begin
a := 2;
b := 3;
writeln('Resultado de a x b: ', a*b);
writeln('Resultado de b div a: ', b div a);
end.
Exemplo 2
var a,b : integer;
begin
write('Entre com o primeiro numero: ');
readln(a);
write('Entre com o segundo numero: ');
readln(b);
if a = b then
writeln('Numeros iguais')
else
writeln('Numeros diferentes');
end.
Deslocamentos
Os deslocamentos se referem à movimentação de bits de um número. O operador "shl" desloca todos os bits de um número para a esquerda, enquanto que o operador "shr" desloca todos os bits para a direita.
Sintaxe:
valor shl/shr numero_de_deslocamentos
Por exemplo, 4 shl 1:
O valor a ser trabalhado é 4, enquanto que haverá apenas 1 deslocamento à esquerda.
Supondo números de 8 bits, temos o valor de 4 em binário: 00000100. Assim:
Passo 0:
76543210 - Ordem dos bits
00000100 - Número original: 4
Passo 1:
76543210 - Ordem dos bits
00000100 - Número original: 4 <-- Desloca
O bit excedete (maior que 7) é descartado, assim como o bit faltante (posição 0) é preenchido com o valor 0. Assim:
Passo 2:
76543210 - Ordem dos bits
00001000 - Novo número: 8
Outro exemplo: 8 shr 2. Oito em binário fica 00001000. Logo:
Passo 0:
76543210 - Ordem dos bits
00001000 - Número: 8
Passo 1:
76543210 - Ordem dos bits
00001000 - Número: ?
Passo 2:
76543210 - Ordem dos bits
00000100 - Número: ?
Passo 3:
76543210 - Ordem dos bits
00000100 - Número: ?
Passo 4:
76543210 - Ordem dos bits
00000010 - Número: 2
Para testar no Pascal, digite o seguinte programa:
begin
write(4 shl 1);
write(8 shl 2);
end.
Para que serve isto?
Lembra-se da Screen 8, que possui o formato de cores RGB codificados em um byte da seguinte forma: gggrrrbb, onde ggg são os bits referentes ao verde; rrr, ao vermelho; e bb ao azul?. Pois, utilizando os deslocadores podemos obter a intendidade de cada componente de cor, a partir de um ponto na tela.
Por exemplo, seja o pixel com intensidade igual a 210 (11010010 em binário):
76543210 - Ordem dos bits
11010010 - Pixel
Olhando diretamente ao pixel, observamos que o código do verde possui valor em binário de 110 (6 em decimal), o vermelho é 100 (4 em decimal) e o azul 10 (2 em decimal).
Para obtermos o valor de cada componente, fazemos deslocamentos a direita. O verde precisa de 5 deslocamentos, enquanto que o vermelho precisa de 2. O azul não precisa de deslocamento.
Entretanto, nem tudo são flores! Por exemplo, ao deslocarmos 2 posições para obter o código do vermelho, o código do verde ainda está lá. O azul, mesmo não deslocando, também possui "lixo", con informações do código do vermelho e do verde. Assim, uma operação lógica será necessária para eliminar os bits indesejáveis.
A operação lógica AND é então aplicada, de forma a apagar os bits com a máscara 0, e manter os bits com a máscara 1. Ex:
76543210 - Ordem dos bits
10101010 - Byte
00001111 - Máscara (0 apaga, 1 mantém ou repete os bits)
--------
00001010 - Byte resultante
Como o azul possui comprimento igual a 2 bits, a máscara será: 00000011 (3 em decimal). Já o vermelho, que tem 3 bits, será: 00000111 (7 em decimal).
Assim, primeiro deslocamos para depois eliminarmos os bits indesejáveis.
O programa completo para obter o valor de cada componente pode ser visto a seguir:
var r, g, b, pixel : byte;
begin
pixel := 210;
r := (pixel shr 2) and 7; { r = 4 }
g := pixel shr 5; { g = 6 }
b := pixel and 3; { b = 2 }
end.