Страница 36 из 502
Таблица 4.1. Поразрядные операторы
Оператор Значение
<b>& </b>Поразрядное И
<b>| </b>Поразрядное ИЛИ
^ Поразрядное исключающее ИЛИ
<b>>> </b>Сдвиг вправо
<b><< </b>Сдвиг влево
~ Дополнение до 1 (унарный оператор НЕ)
Поразрядные операторы И, ИЛИ, исключающее ИЛИ и НЕ обозначаются следующим образом: &, |, ^ и ~. Они выполняют те же функции, что и их логические аналоги, рассмотренные выше. Но в отличие от логических операторов, поразрядные операторы действуют на уровне отдельных двоичных разрядов. Ниже приведены результаты поразрядных операций с двоичными единицами и нулями.
р q <b>р & </b>q <b>p | q p ^ q ~р</b>
0 0 0 0 0 1
1 0 0 1 1 0
0 1 0 1 1 1
1 1 1 1 0 0
С точки зрения наиболее распространенного применения поразрядную операцию И можно рассматривать как способ подавления отдельных двоичных разрядов. Это означает, что если какой-нибудь бит в любом из операндов равен 0, то соответствующий бит результата будет сброшен в 0. Например:
<b> 1101 0011</b>
<b> 1010 1010</b>
&_________
<b> 1000 0010</b>
В приведенном ниже примере программы демонстрируется применение поразрядного оператора & для преобразования нечетных чисел в четные. Для этой цели достаточно сбросить младший разряд числа. Например, число 9 имеет следующий двоичный вид: 0000 1001. Если сбросить младший разряд этого числа, то оно станет числом 8, а в двоичной форме — 0000 1000.
<b>// Применить поразрядный оператор И, чтобы сделать число четным.</b>
<b>using System;</b>
<b>class MakeEven {</b>
<b> static void Main() { </b>
<b> ushort num; ushort i;</b>
<b> for(i =1; i <= 10; i++) {</b>
<b> num = i;</b>
<b> Console.WriteLine("num: " + num); </b>
<b> num = (ushort) (num & 0xFFFE);</b>
<b> Console.WriteLine("num после сброса младшего разряда: "</b>
<b> + num + "n");</b>
<b> }</b>
<b> }</b>
<b>}</b>
Результат выполнения этой программы приведен ниже.
<b>num: 1</b>
<b>num после сброса младшего разряда: 0 </b>
<b>num: 2</b>
<b>num после сброса младшего разряда: 2 </b>
<b>num: 3</b>
<b>num после сброса младшего разряда: 2 </b>
<b>num: 4</b>
<b>num после сброса младшего разряда: 4 </b>
<b>num: 5</b>
<b>num после сброса младшего разряда: 4 </b>
<b>num: 6</b>
<b>num после сброса младшего разряда: 6 </b>
<b>num: 7</b>
<b>num после сброса младшего разряда: 6 </b>
<b>num: 8</b>
<b>num после сброса младшего разряда: 8 </b>
<b>num: 9</b>
<b>num после сброса младшего разряда: 8 </b>
<b>num: 10</b>
<b>num после сброса младшего разряда: 10</b>
Шестнадцатеричное значение 0xFFFE, используемое в поразрядном операторе И, имеет следующую двоичную форму: 1111 1111 1111 1110. Таким образом, поразрядная операция И оставляет без изменения все двоичные разряды в числовом значении переменной num, кроме младшего разряда, который сбрасывается в нуль. В итоге четные числа не претерпевают никаких изменений, а нечетные уменьшаются на 1 и становятся четными.
Поразрядным оператором И удобно также пользоваться для определения установленного или сброшенного состояния отдельного двоичного разряда. В следующем примере программы определяется, является ли число нечетным.
<b>// Применить поразрядный оператор И, чтобы определить,</b>
<b>// является ли число нечетным.</b>
<b>using System;</b>
<b>class IsOdd {</b>