Pascal - Operadores de bits

Os operadores bit a bit suportados pelo Pascal estão listados na tabela a seguir. Suponha que a variável A tenha 60 e a variável B tenha 13, então -

Operador Descrição Exemplo
E O operador Binário AND copia um bit para o resultado se ele existir em ambos os operandos. (A e B) dará 12, que é 0000 1100
| O operador binário OR copia um bit se ele existir em qualquer operando. (A | B) dará 61, que é 0011 1101
! O operador binário OR copia um bit se ele existir em qualquer operando. É o mesmo que | operador. (A! B) dará 61, que é 0011 1101
~ O operador de complemento binários é unário e tem o efeito de 'inverter' bits. (~ A) resultará em -61, que é 1100 0011 na forma de complemento de 2 devido a um número binário com sinal.
<< Operador binário de deslocamento à esquerda. O valor dos operandos à esquerda é movido para a esquerda pelo número de bits especificado pelo operando à direita. Um << 2 dará 240, que é 1111 0000
>> Operador binário de deslocamento à direita. O valor dos operandos à esquerda é movido para a direita pelo número de bits especificado pelo operando à direita. Um >> 2 dará 15, que é 0000 1111

Observe que diferentes implementações de Pascal diferem em operadores bit a bit. Pascal livre, o compilador que usamos aqui, no entanto, suporta os seguintes operadores bit a bit -

Operadores Operações
não NÃO bit a bit
e E bit a bit
ou OR bit a bit
xor OR exclusivo bit a bit
shl Deslocamento à esquerda
Shr Deslocamento bit a bit para a direita
<< Deslocamento à esquerda
>> Deslocamento bit a bit para a direita

O exemplo a seguir ilustra o conceito -

program beBitwise;
var
a, b, c: integer;

begin
   a := 60;	(* 60 = 0011 1100 *)  
   b := 13;	(* 13 = 0000 1101 *)
   c := 0;           

   c := a and b;       (* 12 = 0000 1100 *)
   writeln('Line 1 - Value of c is  ', c );

   c := a or b;       (* 61 = 0011 1101 *)
   writeln('Line 2 - Value of c is  ', c );

   c := not a;          (* -61 = 1100 0011 *)
   writeln('Line 3 - Value of c is  ', c );

   c := a << 2;     (* 240 = 1111 0000 *)
   writeln('Line 4 - Value of c is  ', c );

   c := a >> 2;     (* 15 = 0000 1111 *)
   writeln('Line 5 - Value of c is  ', c );
end.

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Line 1 - Value of c is 12
Line 2 - Value of c is 61
Line 3 - Value of c is -61
Line 4 - Value of c is 240
Line 5 - Value of c is 15