No primeiro caso você deveria ter um erro de compilação, pois x não está inicializado.
Mas se x estivesse inicializado você estaria pegando o quarto bit da direita para a esquerda de x (considerando seu valor binário) e movendo (shift) à direita (divisão por 8 tem o mesmo sentido binário de mover o número 3 casas à direita, visto que 8 == 2^3, o equivalente a fazer: x >> 3).
Exemplo:
int x = 8; // == (00001000 em binário) (na verdade acho que tem mais 24 zeros à esquerda, mas vamos considerar só o byte significativo)
int y = (x & 8) / 8; // == 1
Passo a passo:
x & 8 = 00001000 (em binário)
(x & 8) / 8 = 00000001
No segundo caso, considerando x inicializado com 8 somente para testes, temos
int x = 8; // 00001000 em binário
int y = (x & (1 << 3)) >> 3; // == 1
Você fez a mesma operação, só que com operadores diferentes, operadores bit a bit de shift à esquerda e shift à direita (<< e >>).
Passo a passo:
1 << 3 => 00001000 (em binário) => 8 (em decimal)
x & (1<<3) => x & 8 => 00001000 => 8
(x & (1 << 3)) >> 3 => x & 8 >>3 => 8 >> 3 => 00001000 >> 3 => 00000001 == 1