Have a look at the example:
unsigned char c = 64; /* 0100 0000 */
c = (c << 2 && 512); /* 512: 10 0000 0000 */
If I shift c two times to the left, I should get from 0100 0000 (64) to this 0001 0000 0000 (256). So my 8-bit char c has only zeroes. At the end, I am wondering why the expression (c << 2 && 512) is true (1) and not false (0), because my c has only zeroes.