Nie ma różnic.
Najpierw co to są te "bity" - to jedna z reprezentacji danych. Tak jak możesz przedstawiać liczbę np za pomocą wyrazu, cyfr albo jabłuszek, możesz je też przedstawiać jako sekwencję zer i jedynek, gdzie każde 1 oznacza "ta liczba zawiera w sobie 2 podniesione do potęgi o takim numerze, jak (pozycja tej jedynki licząc od prawej minus 1)".
~ zamienia każdy bit na przeciwny - zera na jedynki, jedynki na zera.
& bierze liczbę po prawej i liczbę po lewej, i w wynikowej liczbie zostawia jedynki tylko na tych pozycjach gdzie w obu operandach też były jedynki
| robi "to samo", z tą różnicą że jedynka wystarczy że jest na tej pozycji w jednej z liczb
Jestem prawie pewien że pisałem o tym tutorial.