^
является XOR
оператор - дали два числа это «выстраивается» их места и переворачивают место только тогда, когда только один из двух чисел имеет это место:
// All of these are binary
111^111 === 000
110^111 === 001
110^110 === 000
Это означает, что changed
будет номер только с теми наборами мест, которые установлены в prev_state
илиstate
, но не оба.
Что касается <<
, которая является оператором сдвига влево - это эффективно повышающий с левой стороны, количество силой двух, что является правая сторона номер:
// Decimal numbers on the left, binary numbers on the right
1 << 1 === 10 // 2
1 << 2 === 100 // 4
1 << 3 === 1000 // 8
// You can use any number on the LHS
2 << 1 === 100 // 4
3 << 2 === 1100 // 12
// Remember, 3 in decimal is equal to 11 in binary
Наконец, &
является бинарный и оператор - возвращает номер, где место только набор, если оба номера имеют 1
в этом месте:
// Both sides binary
1 & 1 === 1
11 & 10 === 10
010 & 100 === 0
Таким образом, в цикле, то первый Проверяются 8 бит измененных, чтобы проверить, установлено ли какое-либо из них - если какой-либо из них установлен, что-то изменилось и событие запущено.Это может быть проще, чтобы увидеть, если разбить его на два этапа:
// All numbers in binary save for 8 ;-)
prev_state = 11111111;
state = 11011111;
changed = 00100000;
Итерация # 1:
mask = 1 << 0 // 0
changeAtPower = changed & mask // 0
// 0 0 0
mask === changedAtPower // false
итерация # 2:
mask = 1 << 1 // 10
changeAtPower = changed & mask // 0
// 00 00 01
mask === changedAtPower // false
Пропуск итераций # 3 до # 5, которые выглядят одинаково, давайте посмотрим на № 6:
mask = 1 << 5 // 100000
changedAtPower = changed & mask // 100000
// 100000 100000 100000
mask === changedAtPower // true
// Event triggered
И затем он продолжается для оставшихся итераций (# 7 и # 8), и поскольку ничего не изменилось, больше не происходит никаких событий.
Это гениальный ответ, большое вам спасибо, я был освещен! –