Операции && || ! :
используются для проверки истинности своих операндов.
Операции & | ^ ~ << >> :
используются для управления битами в своих операндах.
Если у тебя есть переменные 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;
}