El operador and binario convierte a 0 si los alguno de los digitos son cero, y 1 si los dos digitos son uno, o dicho de otra forma:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
Para entenderlo mejor, podrias poner en papel la conversion de los numeros en binario, y asi te das mejor cuenta de como trabaja:
C = 4 = 100 (binario)
si i=0 entonces 1 << i seria 1 << 0, o sea cero corrimiento, por lo tanto 1 << 0 = 001
luego usando el and
100 & 001 = 000
si i=1 entonces 1 << i seria 1 << 1, o sea un corrimiento, por lo tanto 1 << 1 = 010
luego usando el and
100 & 010 = 000
si i=2 entonces 1 << i seria 1 << 2, o sea dos corrimientos, por lo tanto 1 << 2 = 100
luego usando el and
100 & 100 = 100
Repitiendo, y como puedes ver, solamente obtienes 1 cuando los dos digitos son 1, si algun digito es cero, inmediatamente el resultado es cero.
Si tienes mas dudas, como dje antes, escribe la conversion a binario del numero en papel, y te daras cuenta mejor que es lo que pasa.
Saludos