Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

Как работают операции |= и &=~

#cpp #c


Помогите разобраться что делает эта строчка:

PORTX |= (1 << 2);
PORTX &= ~(1 << 2);


Ну совсем не могу понять что это такое |= или &=~...
Можете пояснить на примере эти строчки....
    


Ответы

Ответ 1



битовые операции в Википедии PORTX |= (1 << 2); - это сокращенная запись PORTX = PORTX | (1 << 2); PORTX &= ~(1 << 2); - это сокращенная запись PORTX = PORTX & ~(1 << 2); теперь по частям: << - оператор побитового сдвига. сдвигает биты на 2 влево у числа 1. В общем, получается 4, то есть (1 << 2) == 4. ~ - побитовое НЕ. грубоговоря - инвертирует биты. | - это побитовое ИЛИ. то есть запись вида PORTX = PORTX | 4; устанавливает 2-й бит числа PORTX в единицу. & - это побитовое И. запись вида PORTX & 4 "извлекает" 2-й бит из числа (то есть PORTX & 4 == 0 когда 2-й бит равен 0 и PORTX & 4 != 0 когда 2-й бит равен 1) Запись вида PORTX & ~4 извлекает все биты, кроме 2-го. UPD: поправил про битность. См. 1<<2 - это то же самое, что 1 * 2^2 = 4. Т.е. в двоичной системе - 100b. Т.е. установлен второй бит. Соответственно, с бинарными операциями то же самое. Когда мы применяем PORTX & 4, то мы оставляем 2-й бит, а остальные сбрасываем. Если мы напишем PORTX | 2, то мы установим 1-й бит. P.S. вообще по логике биты в байте нужно нумеровать не с 1, а с 0. И тогда пост нужно поправить еще раз. :-( UPD: поправил сам. биты отсчитываются с нуля.

Ответ 2



|= это оператор присвоения битового "или", аналогичен a |= b -> a = a | b ~ битовая инверсия - операция, изменяющая в переменной все 0 на 1 и все 1 на 0. &= оператор присвоения битового "и" a &= b -> a = a & b

Комментариев нет:

Отправить комментарий