Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

 

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

С точки зрения наиболее распространенного применения поразрядную операцию И можно рассматривать как способ подавления отдельных двоичных разрядов. Это означает, что если какой-нибудь бит в любом из операндов равен 0, то соответствующий бит результата будет сброшен в 0. Поразрядный оператор ИЛИ может быть использован для установки отдельных двоичных разрядов. Если в 1 установлен какой-нибудь бит в любом из операндов этого оператора, то в 1 будет установлен и соответствующий бит в другом операнде. Поразрядный оператор исключающее ИЛИ устанавливает двоичный разряд операнда в том и только в том случае, если двоичные разряды сравниваемых операндов оказываются разными, как в приведенном ниже примере. Для понимания вышесказанного, разберём следующий пример выполнения поразрядных операций:

 

Рис. 2. 1. Примеры выполнение различных поразрядных операций к двоичным последовательностям

 

Рассмотрим пример программы, использующей поразрядные операторы:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace LC_Console

{

class Program

{

static void Main(string[] args)

{

chet(16);

provChet(8);

nechet(16);

Console.WriteLine("\nДля продолжения нажмите любую клавишу... ");

Console.ReadLine();

}

// Метод, преобразующий все нечетные числа в четные

// в диапазоне [0, x] c помощью

// поразрядного оператора &

static void chet(int x)

{

int result;

Console.WriteLine("Преобразованный диапазон чисел от 0 до {0}:\n",x);

 

for (int i = 0; i <= x; i++)

{

// Сбрасываем младший разряд числа, чтобы

// получить четное число

result = i & 0xFFFE;

Console.Write("{0}\t",result);

}

}

// Метод, проверяющий является ли число четным

static void provChet(int x)

{

Console.WriteLine("\n\nПроверка чётности чисел в диапазоне от 1 до {0}:\n",x);

for (int i = 1; i <= x; i++)

{

if ((i & 1) == 0)

Console.WriteLine("Число {0} - является чётным",i);

else

Console.WriteLine("Число {0} - является нечётным",i);

}

}

// Метод, преобразующий четные числа в нечетные

// с помощью поразрядного оператора |

static void nechet(int x)

{

int result;

Console.WriteLine("\nПреобразованный диапазон чисел от 0 до {0}:\n",x);

 

for (int i = 0; i <= x; i++)

{

result = i | 1;

Console.Write("{0}\t",result);

}

}

}

}

 

Рис. 2. 1. Результат работы кода выше

 

Операторы сдвига

 

В С# имеется возможность сдвигать двоичные разряды, составляющие целое значение, влево или вправо на заданную величину. Ниже приведена общая форма для этих операторов:

 

<значение> << <число битов>

<значение> >> <число битов>

 

Где число битов — это число двоичных разрядов, на которое сдвигается указанное значение.

 

При сдвиге влево, все двоичные разряды в указываемом значении сдвигаются на одну позицию влево, а младший разряд сбрасывается в нуль. При сдвиге вправо все двоичные разряды в указываемом значении сдвигаются на одну позицию вправо. Если вправо сдвигается целое значение без-знака, то старший разряд сбрасывается в нуль. А если вправо сдвигается целое значение со знаком, то разряд знака сохраняется. Напомним, что для представления отрицательных чисел старший разряд целого числа устанавливается в 1. Так, если сдвигаемое значение является отрицательным, то при каждом сдвиге вправо старший разряд числа устанавливается в 1. А если сдвигаемое значение является положительным, то при каждом сдвиге вправо старший разряд числа сбрасывается в нуль.

При сдвиге влево и вправо крайние двоичные разряды теряются. Восстановить потерянные при сдвиге двоичные разряды нельзя, поскольку сдвиг в данном случае не является циклическим. Рассмотрим пример:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace LC_Console

{

class Program

{

static void Main(string[] args)

{

byte n = 6, result;

// Умножить на 2

result = (byte)(n << 1);

Console.WriteLine("{0} * 2 = {1}", n, result);

// Умножить на 4

result = (byte)(n << 2);

Console.WriteLine("{0} * 4 = {1}", n, result);

// Разделить на 2

result = (byte)(n >> 1);

Console.WriteLine("{0} / 2 = {1}", n, result);

Console.WriteLine("Для продолжения нажмите любую клавишу... ");

Console.ReadKey();

}

}

}

/* Выведет:

* 6 * 2 = 12

* 6 * 4 = 24

* 6 / 2 = 3

* Для продолжение нажмите любую клавишу...

*/

Применение операторов: тернарный оператор



Поделиться:


Последнее изменение этой страницы: 2016-08-15; просмотров: 558; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.227.209.207 (0.008 с.)