La spiegazione corretta è che quell'espressione serve ad
azzerare (impostare a 0)
il bit di i indicato da j
Nell'esempio che fai, quindi, c'è un errore perché non puoi trattare il bit 8 se scegli la rappresentazione ad 8 bit.
Se vuoi un esempio concreto, il seguente codice imposta i dati in modo che i contenga il valore ASCII del carattere a minuscolo
unsigned char i, j;
i = 'a';
Dato che il bit 5 del carattere ASCII è a 0 per le maiuscole, per azzerare il bit 5 scriverai
j=5;
i&=~(1<<j);
e quindi
printf("%c\n", i);