2014-02-14 4 views
5

У меня есть этот блок кода:Объяснение битовых операторов JavaScript в этой функции

EventBus.on('pfio.inputs.changed', function(state, prev_state) { 
    var changed = prev_state^state; 
    for (var pin = 0; pin < 8; pin++) { 
     if ((changed & (1 << pin)) === (1 << pin)) { 
      EventBus.emit('pfio.input.changed', pin, ((state & (1 << pin)) === (1 << pin))); 
     } 
    } 
}); 

состояние будет 8 бит номер: 00000000
prev_state будет 8 бит номер: 11001110

Эти цифры относятся к состояниям переключателей, поэтому первый в состоянии означает, что контакт 1 выключен. В prev_state первый 1 означает, что переключатель 8 включен.

Я понимаю простое выполнение кода, его эти биты я не могу получить мою голову вокруг:

(changed & (1 << pin)) === (1 << pin)) 

((state & (1 << pin)) === (1 << pin))); 

prev_state^state; 

Любое объяснение по этому вопросу будет сильно помочь!

ответ

7

^ является 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), и поскольку ничего не изменилось, больше не происходит никаких событий.

+0

Это гениальный ответ, большое вам спасибо, я был освещен! –

1
prev_state^state 

делает маску бит, равен 1, где бит в prev_state не согласен с соответствующим битом в state см xor.

(changed & (1 << pin)) === (1 << pin)) 

испытания установлен ли бит с индексом pin, что означало бы, что этот штифт в положение изменилось.

((state & (1 << pin)) === (1 << pin))) 

также испытывает ли бит с индексом pin установлено, что в данном случае означает, что штифт в этом положении теперь 1/комплект/истинно

Смежные вопросы