Объясните что делает этот оператор

DzzZ
Offline
Зарегистрирован: 11.11.2012

Столкнулся с незнокомым оператором  |= 1 << 

 

 



 if (digitalRead(_pin) == HIGH)
            result |= 1 << i; // set subsequent bit
 
result типа byte 
По идее должно происходить смещение по битам в байте.
Спасибо.
 
tsostik
Offline
Зарегистрирован: 28.02.2013

Эта конструкция выполняется в три этапа.

1)Вычисляется значение выражения "1 << i" (сдвинуть число 1 на ш битов влево), фактически получаем число в котором все биты нуллевые, а бит номер i - 1.

2)Выполняется побитовое "или" значения, хранящегося в result со значением, полученным в результате этапа 1. Фактически получаем число, в котором все бита, кробе бита i такие же как в result, а бит i установлен в 1.

3)Значение, полученное на этапе 2 записывается в переменную result.

 

Если говорить более "человеческим" языком - эта конструкция устанавливает в переменной result бит номер i в 1.

leshak
Offline
Зарегистрирован: 29.09.2011

Ну, так оно и происходит.

Какой именно оператор вам не понятент?  << или |=  ?

Вот если будет так записанно

result = result | (1<<i)

так понятней?

leshak
Offline
Зарегистрирован: 29.09.2011

В переводе нет этих операторов. Смотретие в первоисточниках:

Arduino - Bitshift и |Arduino - BitwiseAnd

Вообщем - сделали у  result-та i-тый бит единицей.

Ито тот же самый что и

bitSet(result,i);

Тоьлко bitSet - это "ардуинисто", а "result|=1<<i" -  это как "настоящие С-шный микроконтрольщики" делают :)

DzzZ
Offline
Зарегистрирован: 11.11.2012

Спасибо, ответ даже более чем подробный! Все встало на свои места.