OPERADORES DO TURBO PASCAL

  O objetivo dos operadores é realizar algum tipo de operação (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. Oepradores 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:

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.
<=  Menor ou igual.
<>  Diferente.
=  Igual, em teste. Ex: if a=5
>  Maior.
>=  Maior ou igual.
and  E. Ex: if (a>4) and (b<5)
div  Divisão inteira. Ex: 5 div 4 = 1
in  Inclusão. Ver estrutura SET.
mod  Resto da divisão. 4 mod 3 = 1
not  Negação. if not (a<5) equivale a if (a>=5)
or  OU. Ex: if (a>4) or (b<5)
shl  Shift left (deslocamento à esquerda).
shr  Shift right (deslocamento à direita).
xor  Ou exclusivo. Testa se duas entradas são diferentes.
   
ARITIMÉ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

Obs:

  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.


/MARMSX/CURSOS/PASCAL