Рейтинговые книги
Читем онлайн C# 4.0: полное руководство - Герберт Шилдт

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 21 22 23 24 25 26 27 28 29 ... 294

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

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

&         Поразрядное И

|         Поразрядное ИЛИ

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

>>        Сдвиг вправо

<<        Сдвиг влево

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

Поразрядные операторы И, ИЛИ, исключающее ИЛИ и НЕ

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

р   q   р &p | q  p ^ q   ~р

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. Например:

 1101 0011

 1010 1010

&_________

 1000 0010

В приведенном ниже примере программы демонстрируется применение поразрядного оператора & для преобразования нечетных чисел в четные. Для этой цели достаточно сбросить младший разряд числа. Например, число 9 имеет следующий двоичный вид: 0000 1001. Если сбросить младший разряд этого числа, то оно станет числом 8, а в двоичной форме — 0000 1000.

// Применить поразрядный оператор И, чтобы сделать число четным.

using System;

class MakeEven {

  static void Main() {

    ushort num; ushort i;

    for(i =1; i <= 10; i++) {

      num = i;

      Console.WriteLine("num: " + num);

      num = (ushort) (num & 0xFFFE);

      Console.WriteLine("num после сброса младшего разряда: "

                  + num + "n");

    }

  }

}

Результат выполнения этой программы приведен ниже.

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. В противном случае он равен нулю. Поэтому оператор i f может быть выполнен успешно лишь в том случае, если проверяемое число оказывается нечетным.

Возможностью проверять состояние отдельных двоичных разрядов с помощью поразрядного оператора & можно воспользоваться для написания программы, в которой отдельные двоичные разряды проверяемого значения типа byte приводятся в двоичной форме. Ниже показан один из способов написания такой программы.

// Показать биты, составляющие байт.

using System;

class ShowBits {

  static void Main() {

    int t;

    byte val;

    val = 123;

    for(t=128; 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

1 ... 21 22 23 24 25 26 27 28 29 ... 294
На этой странице вы можете бесплатно читать книгу C# 4.0: полное руководство - Герберт Шилдт бесплатно.
Похожие на C# 4.0: полное руководство - Герберт Шилдт книги

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