Arduino:Справочник языка Arduino/Унарные операторы/&= (побитовый оператор AND, совмещенный с присваиванием): различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
 
Строка 9: Строка 9:
==Синтаксис==
==Синтаксис==


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
x &= y; // это то же самое, то и x = x & y
x &= y; // это то же самое, то и x = x & y
</syntaxhighlight>
</syntaxhighlight>
Строка 15: Строка 15:
==Параметры==
==Параметры==


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
x — переменная в виде символа, целого или длинного целого
x — переменная в виде символа, целого или длинного целого
y — константа в виде целого или символ, целое или длинное целое
y — константа в виде целого или символ, целое или длинное целое
Строка 24: Строка 24:
Во-первых, вспомним, как работает '''побитовый AND''':
Во-первых, вспомним, как работает '''побитовый AND''':


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
0  0  1  1    operand1
0  0  1  1    operand1
0  1  0  1    operand2
0  1  0  1    operand2
Строка 33: Строка 33:
Таким образом, у пар, где есть как минимум один '''«0»''', в итоге тоже получается '''«0»''', поэтому...
Таким образом, у пар, где есть как минимум один '''«0»''', в итоге тоже получается '''«0»''', поэтому...


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
myByte & B00000000 = 0;  
myByte & B00000000 = 0;  
</syntaxhighlight>
</syntaxhighlight>
Строка 39: Строка 39:
…а у пар, где оба бита — '''«1»''', итоговым битом тоже будет '''«1»''', то есть...
…а у пар, где оба бита — '''«1»''', итоговым битом тоже будет '''«1»''', то есть...


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
myByte & B11111111 = ByByte;
myByte & B11111111 = ByByte;
</syntaxhighlight>
</syntaxhighlight>
Строка 47: Строка 47:
Следовательно, оператор '''«&=»''' (используемый вместе с константой воде '''B11111100''') нужен как раз для того, чтобы '''«очистить»''' некоторые биты, а другие оставить нетронутыми.
Следовательно, оператор '''«&=»''' (используемый вместе с константой воде '''B11111100''') нужен как раз для того, чтобы '''«очистить»''' некоторые биты, а другие оставить нетронутыми.


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
1  0  1  0  1  0  1  0    переменная   
1  0  1  0  1  0  1  0    переменная   
1  1  1  1  1  1  0  0    маска
1  1  1  1  1  1  0  0    маска
Строка 56: Строка 56:
Теперь похожий пример, но биты переменной заменены на '''«иксы»''':
Теперь похожий пример, но биты переменной заменены на '''«иксы»''':


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
x  x  x  x  x  x  x  x    переменная
x  x  x  x  x  x  x  x    переменная
1  1  1  1  1  1  0  0    маска
1  1  1  1  1  1  0  0    маска
Строка 65: Строка 65:
Поэтому если:
Поэтому если:


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
myByte =  B10101010;
myByte =  B10101010;
myByte &= B11111100 == B10101000;
myByte &= B11111100 == B10101000;

Текущая версия от 12:40, 20 мая 2023

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Побитовый оператор AND, совмещенный с присваиванием[1]

Побитовый AND, совмещенный с присваиванием (обозначается как «&=»), как правило, требует переменной и константы. Он переключает некоторые биты в состояние LOW (т.е. на «0»). В руководствах по программированию эти биты часто называют «очищающими» или «сбрасывающими».

Синтаксис

x &= y; // это то же самое, то и x = x & y

Параметры

x  переменная в виде символа, целого или длинного целого
y  константа в виде целого или символ, целое или длинное целое

Пример

Во-первых, вспомним, как работает побитовый AND:

0  0  1  1    operand1
0  1  0  1    operand2
----------
0  0  0  1    (operand1 & operand2)  возвращенный результат

Таким образом, у пар, где есть как минимум один «0», в итоге тоже получается «0», поэтому...

myByte & B00000000 = 0;

…а у пар, где оба бита — «1», итоговым битом тоже будет «1», то есть...

myByte & B11111111 = ByByte;

Примечание: Поскольку мы работаем с битами, для пущего удобства константы лучше переделать в бинарный вид. Да, эти числа не так понятны, как числа в десятеричном выражении, но они все те же, просто по-другому представлены. И константа B00000000 указана тут для наглядности... ноль — это всегда ноль, в каком бы формате они ни был (хм, что-то меня потянуло на философию...).

Следовательно, оператор «&=» (используемый вместе с константой воде B11111100) нужен как раз для того, чтобы «очистить» некоторые биты, а другие оставить нетронутыми.

1  0  1  0  1  0  1  0    переменная  
1  1  1  1  1  1  0  0    маска
----------------------
1  0  1  0  1  0  0  0    первые 6 бит остались нетронутыми, 2 последних - были очищены

Теперь похожий пример, но биты переменной заменены на «иксы»:

x  x  x  x  x  x  x  x    переменная
1  1  1  1  1  1  0  0    маска
----------------------
x  x  x  x  x  x  0  0    первые 6 бит остались нетронутыми, 2 последних  были очищены

Поэтому если:

myByte =  B10101010;
myByte &= B11111100 == B10101000;

См.также

  1. |= (побитовый оператор OR, совмещенный с присваиванием)
  2. Побитовый оператор AND (&)
  3. Побитовый оператор OR

Внешние ссылки