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]:
  1. Sinal negativo com um operando.
  2. Operador lógico NOT.
  3. Operadores de multiplicação: *, /, div, mod, and, shl, shr.
  4. Operadores de adição: +, -, or, xor.
  5. 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.

<< Anterior Pascal Próxima >>