DUVIDA - Operação com Byte Array

Olá, eu to desenvolvendo um programa para ler determinado tipo de arquivo e ler as informações dos pacotes desse arquivo em nivel de bits.

No caso o pacote é dividido da seguinte forma:

SYC 8 bits
TEI 1 bits
PSI 1 bits
TP 1 bits
PID 13 bits
TSC 2 bits
AFC 2 bits
CC 4 bits

Minha dúvida é, como faço para pegar os bits separadamente, como o do PID por exemplo que 5 bits se encontram na posição 1 do array e 8 bits na posição 2, já que só tenho acesso a um byte por vez o qual contém 8 bits.
Tenho esse exemplo de código para pegar o PID e o mesmo reproduz o resultado correto:

int pid1 = (buf[1] << 8) | (buf[2] & 0xff);

O que não consegui entender foi o motivo das operações logicas da equação, principalmente o buf[1]<<8. Alguem saberia me explicar essa equação e como devo proceder nos próximos bits?

Obrigado.