В чем разница между & и &&?
& - битовая операция и работает с целыми, а не с bool как вы решили.
&& - операция логическая и работает с bool.
Аналогично с | и ||. Дальше - гугл по словам "%LANGNAME% operators"
Операции && || ! :
используются для проверки истинности своих операндов.
Операции & | ^ ~ << >> :
используются для управления битами в своих операндах.
Если у тебя есть переменные flag1, flag2, flag3, ты можешь проверить их на истинность:if ((flag1 && flag2) || !flag3) {
    something;
}
А если у тебя есть переменная states, ты можешь проверить в ней какие-то определённые биты:if (states & (0x1 | 0x4)) {
    something;
}
0x1 - в битовом представлении выглядит как
00000000 00000000 00000000 00000001
0x4 - в битовом представлении выглядит как
00000000 00000000 00000000 00000100
0x1 | 0x4 - в битовом представлении выглядит как
00000000 00000000 00000000 00000101
Пример1:
Если states равно 0x123 - в битовом представлении это выглядит как
00000000 00000000 00000001 00100011
Выражение states & (0x1 | 0x4) - в битовом представлении будет выглядеть как
00000000 00000000 00000001 00100011 &
00000000 00000000 00000000 00000101
=
00000000 00000000 00000000 00000001
Получилось, что всё выражение равно 0x1 или просто 1.if (0x1) {
    something;
}
Пример2:
Если states равно 0x122 - в битовом представлении это выглядит как
00000000 00000000 00000001 00100010
Выражение states & (0x1 | 0x4) - в битовом представлении будет выглядеть как
00000000 00000000 00000001 00100010 &
00000000 00000000 00000000 00000101
=
00000000 00000000 00000000 00000000
Получилось, что всё выражение равно 0x0 или просто 0.if (0x0) {
    something;
}