- •Язык c# и структура простой программы
- •Что такое .Net Framework
- •Что такое с#
- •Создание первой программы на с#
- •Пространство имен System
- •С# как язык Объектно-Ориентированного Программирования (ооп)
- •Состав и назначение файлов проекта
- •Структура сборки
- •Элементы языка c#
- •Базовый синтаксис с#
- •Переменные
- •Числа без знака
- •Числа со знаком
- •Числа для финансистов
- •Текстовые символы
- •Логический тип данных
- •Литералы с плавающей точкой
- •Символьные литералы
- •Строковые литералы
- •Выражения и операторы с#
- •Инициализация переменных и оператор присваивания
- •Значение в левой части
- •Ввод данных с консоли
- •Математические операторы
- •Вычисление остатка при целочисленном делении
- •Унарные операторы
- •Унарное логическое отрицание
- •Составные операторы
- •Поразрядные операторы
- •Поразрядное логическое и
- •Поразрядное логическое или
- •Поразрядное логическое исключающее или
- •Унарная поразрядная операция дополнения
- •Поразрядный сдвиг
- •Пример использования поразрядных операторов
- •Логические операторы
- •Операторы отношения
- •Приоритеты операторов
- •Исполнители алгоритмов
- •Исполнитель Чертежник
- •Исполнитель Робот
- •Компьютер как формальный исполнитель алгоритмов
- •Блок-схема
- •Псевдокод
- •Необходимые свойства алгоритма
- •Понятие о временной сложности алгоритма
- •Примеры
- •Правила для определения сложности
- •Тернарный условный оператор
- •Применение логических операций
- •Конструкция выбора
- •Примеры применения оператора выбора
- •Объединение меток case
- •Пропущенный break
- •Пример программы: Простые числа
- •Пример обработки одномерного массива чисел
- •Использование генератора случайных данных
- •Использование оператора foreach
- •Типы задач обработки одномерных числовых массивов
- •Поиск элемента в массиве
- •Многомерные массивы
- •Базовые операции со строками
- •Методы типа string
- •Копирование и клонирование строк
- •Конкатенация строк
- •Извлечение подстроки
- •Вставка подстроки
- •Замена символов и строк
- •Удаление символов из строки
- •Удаление незначащих пробелов
- •Преобразование к верхнему и нижнему регистру
- •Выравнивание по левому и правому краю поля
- •Объединение массива строк
- •Разбор строки
- •Сравнение строк
- •Форматирование текстовых строк
- •Функции
- •Описание и использование функций
- •Возвращаемые значения
- •Передача параметров
- •Выходные параметры
- •Область действия переменных
- •Область действия переменных и управляющие конструкции
- •Рекурсия
- •Параметры функции Main()
- •Перегрузка функций
- •Перечислимый тип
- •Определение перечислимых типов
- •Структуры
- •Описание структур
- •Использование структур в качестве параметров функций
- •Использование структур в качестве возвращаемых значений функций
- •Функции структур
- •Файлы и потоки
- •Основные классы ввода и вывода
- •Классы для работы с потоками
- •Классы для работы с потоками текстовых символов
- •Работа с текстовыми файлами
Унарная поразрядная операция дополнения
Унарная поразрядная операция дополнения обозначается символом ~. Она заменяет состояние каждого разряда противоположным. Эта операция выполняется только над одним операндом, т. е. она унарная.
Операнд |
Результат |
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();
}
}
}
Результат работы данной программы представлен ниже:
Анализ данного результата предоставляется для самостоятельного выполнения. Представьте результаты работы поразрядных операторов в двоичном виде и убедитесь, что все действия над разрядами исходного числа выполнены правильно.
