Per completezza:
and &&
or ||
bitwise and &
bitwise or |

Cosa sono i bitwise?
In pratica fanno l'operazione bit per bit, come sarebbe legittimo aspettarsi.
In genere le operazioni logiche si fanno con i booleani, che vengono rappresentati proprio con 1 bit, quindi il risultato non cambia.

Perché allora esistono i bitwise?
Anche per un altro (utile) motivo: i bitwise eseguono obbligatoriamente tutti i rami, mentre gli operatori "standard" troncano in automatico i rami inutili.

Un esempio pratico:
if (miaVariabile && miaFunzione())
...

se miaVariabile è "false" la miaFunzione non verrà assolutamente eseguita perché inutile alla determinazione del risultato, quindi se faceva alcune operazioni prima di ritornare true o false, se miaVariabile è "false" non le fa.

Che io sappia tutti i principali linguaggi moderni usano questa feature, tanto che è buona programmazione, in una lista di condizioni in &&, di piazzare a sinistra quelle che hanno maggior probabilità di essere false.