Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс_ред1 С#.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
1.8 Mб
Скачать

Унарная поразрядная операция дополнения

Унарная поразрядная операция дополнения обозначается символом ~. Она заменяет состояние каждого разряда противоположным. Эта операция выполняется только над одним операндом, т. е. она унарная.

Операнд

Результат

0

1

1

0

То же самое справедливо и для многоразрядного числа:

Операнд

1

1

1

0

0

1

1

0

Результат операции дополнения

0

0

0

1

1

0

0

1

Как видно из этой таблицы, после выполнения операции дополнения все разряды байта изменили свое состояние.

Поразрядный сдвиг

В языке С# имеются два оператора поразрядного сдвига: << и >>. Первый из них выполняет поразрядный сдвиг влево, а второй — вправо.

При сдвиге влево старшие разряды теряются (отбрасываются), а на место младших разрядов записываются нули. Способ выполнения сдвига вправо зависит от того, над данными какого типа выполняется операция.

Если операция сдвига вправо выполняется над целыми числами без знака (byte, uint, ulong), младшие разряды теряются, а на место старших разрядов записываются нули.

Когда операция сдвига вправо выполняется над целыми числами со знаком (sbyte, int, long), то для положительных чисел старшие разряды заполняются нулями, а для отрицательных — единицами. Младшие разряды теряются в любом случае.

Пример выполнения операции поразрядного сдвига для чисел со знаком и без знака показан на следующих таблицах:

Сдвиг вправо на 3 разряда (число без знака):

Операнд

1

1

1

0

0

1

1

0

Результат сдвига

0

0

0

1

1

1

0

0

Сдвиг вправо на 3 разряда (число со знаком):

Операнд

1

1

1

0

0

1

1

0

Результат сдвига

1

1

1

1

1

1

0

0

Сдвиг влево на 3 разряда (число без знака):

Операнд

1

1

1

0

0

1

1

0

Результат сдвига

0

0

1

1

0

0

0

0

Пример использования поразрядных операторов

Выполнение поразрядных операторов демонстрируется в программе, исходный текст которой приведен ниже. В ней последовательно применяются несколько различных поразрядных операторов к числу 0х5А5А. В двоичном представлении это число записывается как 0101101001011010.

using System;

namespace Bitwise

{

class BitWiseApp

{

static void Main(string[] args)

{

uint op = 0x5A5A;

uint result = op & 0xA;

System.Console.WriteLine("op = {0:X}, op & 0xA = {1:X}",

op, result);

result = op | 0xF;

System.Console.WriteLine("op = {0:X}, op | 0xF = {1:X}",

op, result);

result = op ^ 0xF;

System.Console.WriteLine("op = {0:X}, op ^ 0xF = {1:X}",

op, result);

result = ~op;

System.Console.WriteLine("op = {0:X}, ~op = {1:X}",

op, result);

result = op << 3;

System.Console.WriteLine("op = {0:X}, op << 3 = {1:X}",

op, result);

result = op >> 3;

System.Console.WriteLine("op = {0:X}, op >> 3 = {1:X}",

op, result);

System.Console.ReadLine();

}

}

}

Результат работы данной программы представлен ниже:

Анализ данного результата предоставляется для самостоятельного выполнения. Представьте результаты работы поразрядных операторов в двоичном виде и убедитесь, что все действия над разрядами исходного числа выполнены правильно.