Operadores de bits são usados para manipular bits de dados.  Todos estes operadores são projetados para trabalhar apenas com números inteiros, por isso, o interpretador tentará converter os seus operandos para inteiros antes de executá-los.

O mais simples é operador de bit é o não binário, que negará todos os bits de um número inteiro.
Ex:

$x = 0;
echo ~$x; //irá imprimir -1

Um grupo de operadores binário é usado para executar a manipulação básica de bit, combinando os dois bits de seus operandos, de várias maneiras:

& Operador AND (e). O resultado da operação será um valor ativo caso eles estejam setados em ambos os operandos, e desativado caso contrário.
| Operador OR (ou). O resultado da operação será um valor ativo caso eles estejam setados em algum dos operandos, e desativado caso não esteja em nenhum dos operandos.
^ Operador XOR (ou exclusivo). O resultado da operação será um valor cujo os bits serão ativos em um ou outro operando, e desativados caso contrario.

Estas operações são todas muito simples, com a possível exceção do XOR (ou exclusivo), que pode parecer estranho à primeira vista. Na realidade, sua funcionalidade é bastante simples: se o bit à esquerda ou direita está configurado, o operando comporta exatamente como o OR (ou). Se ambos os bits estão ativados ou desativados, o resultado é simplesmente invertido.
Um terceiro conjunto de operadores é usado para transferir os bits da esquerda ou direita:

<< deslocar bits para esquerda – Esta operação desloca à esquerda dos bits do operando por um número de posições igual ao direito do operando, introduzindo bits vazios nas posições de deslocamento.
>> deslocar bits para direita – Esta operação desloca à direita dos bits do operando por um número de posições igual ao direito do operando, introduzindo bits vazios nas posições de deslocamento.

É interessante notar que estas duas últimas operações proporcionam uma forma fácil (e muito rápida) de multiplicar inteiros com uma potência de dois. Por exemplo:

$x = 1;
echo $x << 1; // será impresso 2
echo $x << 2; // será impresso 4

$x = 8;
echo $x >> 1; // será impresso 4
echo $x >> 2; // será impresso 2

Você deve, entretanto, estar ciente do fato que, mesmo que estas operações possam aproximar uma multiplicação ou uma divisão por uma potência de dois, não é exatamente a mesma coisa. Os cenários que podem ser obtidos resultados inesperados. Por exemplo, em uma máquina de 32 bits, vai acontecer o seguinte:

$x = 1;
echo $x << 32;
echo $x * pow (2, 32);

A segunda linha deste exemplo obterá saídas zero, porque todos os bits têm sido deslocado para fora do valor inteiro. Por outro lado, segundo o exemplo (que solicita o Pow () função para elevar o poder de 2 a 32) irá retornar o valor correto 4.294.967.296 que, casualmente, agora será um valor flutuante porque tal número não pode ser representado usando um inteiro de 32 bits.