Добавить в цитаты Настройки чтения

Страница 36 из 502

Таблица 4.1. Поразрядные операторы

Оператор  Значение

<b>&amp;         </b>Поразрядное И

<b>|         </b>Поразрядное ИЛИ

^         Поразрядное исключающее ИЛИ

<b>&gt;&gt;        </b>Сдвиг вправо

<b>&lt;&lt;        </b>Сдвиг влево

~         Дополнение до 1 (унарный оператор НЕ)

Поразрядные операторы И, ИЛИ, исключающее ИЛИ и НЕ обозначаются следующим образом: &, |, ^ и ~. Они выполняют те же функции, что и их логические аналоги, рассмотренные выше. Но в отличие от логических операторов, поразрядные операторы действуют на уровне отдельных двоичных разрядов. Ниже приведены результаты поразрядных операций с двоичными единицами и нулями.

р   q   <b>р &amp; </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>

&amp;_________

<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 &lt;= 10; i++) {</b>

<b>      num = i;</b>

<b>      Console.WriteLine(&quot;num: &quot; + num); </b>

<b>      num = (ushort) (num &amp; 0xFFFE);</b>

<b>      Console.WriteLine(&quot;num после сброса младшего разряда: &quot;</b>

<b>                  + num + &quot;n&quot;);</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>