Обобщено, a |= b
равно a = a | b
.
Для вашего кода выражение
retval |= (digitalRead(_data_pins[i]) == HIGH)?(1 << i):0;
равно
retval = retval | (digitalRead(_data_pins[i]) == HIGH)?(1 << i):0;
То есть, retval
сам по себе ни с чем не сравнивается.Вместо этого его предыдущее значение используется с побитовым ИЛИ, и результат этого присваивается обратно retval
.
И если мы переписываем условное выражение в оператор if else
, это будет похоже на
if (digitalRead(_data_pins[i]) == HIGH)
retval = retval | (1 << i);
else
retval = retval | 0;
Надеюсь, это будет намного легче понять.