Они определены только для целочисленных операндов
& Поразрядное И
| Поразрядное ИЛИ
^ Поразрядное исключающее ИЛИ
>> Сдвиг вправо
<< Сдвиг влево
~ Дополнение до 1 (унарный оператор НЕ)
С точки зрения наиболее распространенного применения поразрядную операцию И можно рассматривать как способ подавления отдельных двоичных разрядов. Это означает, что если какой-нибудь бит в любом из операндов равен 0, то соответствующий бит результата будет сброшен в 0.
В приведенном ниже примере программы демонстрируется применение поразрядного оператора & для преобразования нечетных чисел в четные. Для этой цели достаточно сбросить младший разряд числа. Например, число 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");
}
}
}
Шестнадцатеричное значение 0xFFFE, используемое в поразрядном операторе И, имеет следующую двоичную форму: 1111 1111 1111 1110.
// Применить поразрядный оператор И, чтобы определить, является ли число нечетным.
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 + " — нечетное число.");
}
}
// Показать биты, составляющие байт.
using System;
class ShowBits
{
static void Main()
{
byte val = 123;
for (int t = 128; t > 0; t = t / 2)
{
if ((val & t)!= 0) Console.Write("1 ");
if ((val & t) == 0) Console.Write("0 ");
}
}
}
// Применить поразрядный оператор ИЛИ, чтобы сделать число нечетным.
using System;
class MakeOdd
{
static void Main()
{
ushort num, i;
for (i = 1; i <= 10; i++)
{
num = i;
Console.WriteLine("num: " + num);
num = (ushort)(num | 1);
Console.WriteLine("num после установки младшего разряда: " + num + "\n");
}
}
}
Поразрядный оператор исключающее ИЛИ устанавливает двоичный разряд операнда в том и только в том случае, если двоичные разряды сравниваемых операндов оказываются разными, как в приведенном ниже примере.
У поразрядного оператора исключающее ИЛИ имеется одно интересное свойство, которое оказывается полезным в самых разных ситуациях. Так, если выполнить сначала поразрядную операцию исключающее ИЛИ одного значения Xс другим значением Y, а затем такую же операцию над результатом предыдущей операции и значением Y, то вновь получится первоначальное значение X. Это означает, что в приведенном ниже фрагменте кода
R1 = X ^ Y;
R2 = R1 ^ Y;
значение переменной R2 оказывается в итоге таким же, как и значение переменной X.
|
|
// Продемонстрировать применение поразрядного оператора исключающее ИЛИ.
using System;
class Encode
{
static void Main()
{
char ch1 = 'H', ch2 = 'i', ch3 = '!';
int key = 88;
Console.WriteLine("Исходное сообщение: " + ch1 + ch2 + ch3);
// Зашифровать сообщение.
ch1 = (char)(ch1 ^ key);
ch2 = (char)(ch2 ^ key);
ch3 = (char)(ch3 ^ key);
Console.WriteLine("Зашифрованное сообщение: " + ch1 + ch2 + ch3);
// Расшифровать сообщение.
ch1 = (char)(ch1 ^ key);
ch2 = (char)(ch2 ^ key);
ch3 = (char)(ch3 ^ key);
Console.WriteLine("Расшифрованное сообщение: " + ch1 + ch2 + ch3);
}
}
// Продемонстрировать применение поразрядного унарного оператора НЕ.
using System;
class NotDemo
{
static void Main()
{
sbyte b = -34;
for (int t = 128; t > 0; t = t / 2)
{
if ((b & t)!= 0) Console.Write("1 ");
if ((b & t) == 0) Console.Write("0 ");
}
Console.WriteLine();
// обратить все биты
b = (sbyte)~b;
for (int t = 128; t > 0; t = t / 2)
{
if ((b & t)!= 0) Console.Write("1 ");
if ((b & t) == 0) Console.Write("0 ");
}
}
}