Há uma operação matemática que se chama "E" (AND em inglês). Esta operação é definida assim:
quando ambos os operadores são 1 o resultado é 1, quando um dos dois operadores é 0 o resultado é 0.
A operação que em C se representa por &, é chamada bitwise AND (ou E bit-a-bit, em português). Para analisar esta operação deve olhar-se para os valores dos operadores em binário. Sendo assim, se tiver-mos 1011 0010 e 1001 0101, o resultado deste E bit-a-bit será 1001 000, isto é, o bit do resultado é 1 quando o bit correspondente de cada um dos operadores é 1 e 0 nos outros casos.
Outra operação que aparece na instrução que questiona é a deslocação. Para analisar esta instrução tem que se olhar também para o valor em binário daquilo que se está a deslocar. Sendo assim, se tiver o valor 53 (em binário 0011 0101) e o deslocar três bits para a esquerda (representa-se: 53 << 3) o resultado será 1010 1000. Isto é, são acrescentados 3 zeros à direita do número e os bits que estavam à esquerda desaparecem. NOTA: estou a considerar que a variável é de 8 bits, mas se o comprimento for diferente, o raciocínio é o mesmo mas com um número diferente de bits. (já agora, o resultado do deslocamento para a esquerda, equivale a uma multiplicação por 2, por cada bit que se desloca , no entanto, no caso do exemplo, não é exactamente esse resultado, pois os bits mais à esquerda desapareceram)
Para além disso, também é importante referir que no if, quando o resultado da condição (a condição é o que está dentro dos parêntesis) é 0, NÃO é executado o que está no bloco de instruções (o que está entre chavetas) que segue o if. Se o resultado da condição for outro valor qualquer, é executado o bloco de instruções.
Chegando aqui é importante "partir" a instrução que levanta dúvidas em duas partes. A primeira a do deslocamento e a segunda a do bitwise AND.
Sendo assim a parte (1 << x), pega no valor 1 e desloca-o x vezes para a esquerda. por exemplo, se x for 3 o resultado será 0000 1000.
Para a outra parte da instrução o resultado do bitwise AND entre o resultado daquilo que foi deslocado e 53 (0011 0101) daria 0000 0000. O resultado do AND com 56 (0011 1000) daria 0000 1000 sendo assim um valor diferente de 0 e desta forma o bloco de instruções do if seria executado.
Sendo assim, a funcionalidade deste if, é pegar na variável i e para cada bit desta variável, verificar se este é 1 ou 0. Se o bit for 1 coloca o pino data a HIGH, se o bit for 0 coloca o pino a LOW.
Peço desculpa pela extensão da resposta, mas como não sei qual é o seu nível de conhecimentos e concretamente em que parte da instrução está a sua dúvida, decidi explicar tudo desde o início. Se a dúvida persistir, diga alguma coisa.