Результат выполнения этой программы приведен ниже. num: 1 num после сброса младшего разряда: 0 num: 2 num после сброса младшего разряда: 2 num: 3 num после сброса младшего разряда: 2 num: 4 num после сброса младшего разряда: 4 num: 5 num после сброса младшего разряда: 4 num: 6 num после сброса младшего разряда: 6 num: 7 num после сброса младшего разряда: 6 num: 8 num после сброса младшего разряда: 8 num: 9 num после сброса младшего разряда: 8 num: 10 num после сброса младшего разряда: 10
Шестнадцатеричное значение 0xFFFE, используемое в поразрядном операторе И, имеет следующую двоичную форму: 1111 1111 1111 1110. Таким образом, пораз рядная операция И оставляет без изменения все двоичные разряды в числовом значе нии переменной num, кроме младшего разряда, который сбрасывается в нуль. В итоге четные числа не претерпевают никаких изменений, а нечетные уменьшаются на 1 и становятся четными.
Поразрядным оператором И удобно также пользоваться для определения уста новленного или сброшенного состояния отдельного двоичного разряда. В следующем примере программы определяется, является ли число нечетным. // Применить поразрядный оператор И, чтобы определить, // является ли число нечетным. using System; class IsOdd { static void Main { ushort num; num = 10; if((num & 1) == 1) Console.WriteLine("He выводится."); num = 11; if((num & 1) == 1) Console.WriteLine(num + " — нечетное число."); } }
Вот как выглядит результат выполнения этой программы. 11 — нечетное число.
В обоих операторах if из приведенной выше программы выполняется поразрядная операция И над числовыми значениями переменной num и 1. Если младший двоич ный разряд числового значения переменной num установлен, т.е. содержит двоичную 1, то результат поразрядной операции num & 1 оказывается равным 1. В противном случае он равен нулю. Поэтому оператор if может быть выполнен успешно лишь в том случае, если проверяемое число оказывается нечетным.
Возможностью проверять состояние отдельных двоичных разрядов с помощью по разрядного оператора & можно воспользоваться для написания программы, в которой отдельные двоичные разряды проверяемого значения типа byte приводятся в двоич ной форме. Ниже показан один из способов написания такой программы. // Показать биты, составляющие байт. using System; class ShowBits { static void Main { int t; byte val; val = 123; for (t=l28; t > 0; t = t/2) { if((val & t) != 0) Console.Write("1 "); if((val & t) == 0) Console.Write("0 "); } } }
Выполнение этой программы дает следующий результат. 0 1 1 1 1 0 1 1
В цикле for из приведенной выше программы каждый бит значения переменной val проверяется с помощью поразрядного оператора И, чтобы выяснить, установлен ли этот бит или сброшен. Если он установлен, то выводится цифра 1, а если сброшен, то выводится цифра 0.
Поразрядный оператор ИЛИ может быть использован для установки отдельных дво ичных разрядов. Если в 1 установлен какой-нибудь бит в любом из операндов этого опе ратора, то в 1 будет установлен и соответствующий бит в другом операнде. Например: 1101 0011 1010 1010 | __________ 1111 1011
Используя поразрядный оператор ИЛИ, можно без особого труда превратить упо минавшийся выше пример программы, преобразующей нечетные числа в четные, в приведенный ниже обратный пример, где четные числа преобразуются в нечетные. // Применить поразрядный оператор ИЛИ, чтобы сделать число нечетным. using System; class MakeOdd { static void Main { ushort num; ushort i; for(i = 1; i <= 10; i++) { num = i; Console.WriteLine("num: " + num); num = (ushort) (num | 1); Console.WriteLine("num после установки младшего разряда: " + num + "\n"); } } }
Результат выполнения этой программы выглядит следующим образом. num: 1 num после установки младшего разряда: 1 num: 2 num после установки младшего разряда: 3 num: 3 num после установки младшего разряда: 3 num: 4 num после установки младшего разряда: 5 num: 5 num после установки младшего разряда: 5 num: 6 num после установки младшего разряда: 7 num: 7 num после установки младшего разряда: 7 num: 8 num после установки младшего разряда: 9 num: 9 num после установки младшего разряда: 9 num: 10 num после установки младшего разряда: 11
В приведенной выше программе выполняется поразрядная операция ИЛИ над каждым числовым значением переменной num и 1, поскольку 1 дает двоичное значе ние, в котором установлен младший разряд. В результате поразрядной операции ИЛИ над 1 и любым другим значением младший разряд последнего устанавливается, тогда как все остальные разряды остаются без изменения. Таким образом, результирующее числовое значение получается нечетным, если исходное значение было четным.