СДЕЛАЙТЕ СВОИ УРОКИ ЕЩЁ ЭФФЕКТИВНЕЕ, А ЖИЗНЬ СВОБОДНЕЕ

Благодаря готовым учебным материалам для работы в классе и дистанционно

Скидки до 50 % на комплекты
только до

Готовые ключевые этапы урока всегда будут у вас под рукой

Организационный момент

Проверка знаний

Объяснение материала

Закрепление изученного

Итоги урока

Поразрядные операции

Категория: Информатика

Нажмите, чтобы узнать подробности

Просмотр содержимого документа
«Поразрядные операции»

Особый класс операций представляют поразрядные операции. Они выполняются над отдельными разрядами числа. В этом плане числа рассматриваются в двоичном представлении, например, 2 в двоичном представлении 10 и имеет два разряда, число 7 - 111 и имеет три разряда.

Логические операции

  • &(логическое умножение)

Умножение производится поразрядно, и если у обоих операндов значения разрядов равно 1, то операция возвращает 1, иначе возвращается число 0. Например:

1

2

3

4

5

6

7

int x1 = 2; //010

 int y1 = 5;//101

 Console.WriteLine(x1&y1); // выведет 0

             

int x2 = 4; //100

int y2 = 5; //101

Console.WriteLine(x2 & y2); // выведет 4

В первом случае у нас два числа 2 и 5. 2 в двоичном виде представляет число 010, а 5 - 101. Поразрядно умножим числа (0*1, 1*0, 0*1) и в итоге получим 000.

Во втором случае у нас вместо двойки число 4, у которого в первом разряде 1, так же как и у числа 5, поэтому в итоге получим (1*1, 0*0, 0 *1) = 100, то есть число 4 в десятичном формате.

  • | (логическое сложение)

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

1

2

3

4

5

6

int x1 = 2; //010

int y1 = 5;//101

Console.WriteLine(x1|y1); // выведет 7 - 111

int x2 = 4; //100

int y2 = 5;//101

Console.WriteLine(x2 | y2); // выведет 5 - 101

  • ^ (логическое исключающее ИЛИ)

Также эту операцию называют XOR, нередко ее применяют для простого шифрования:

1

2

3

4

5

6

7

int x = 45; // Значение, которое надо зашифровать - в двоичной форме 101101

int key = 102; //Пусть это будет ключ - в двоичной форме 1100110

int encrypt = x ^ key; //Результатом будет число 1001011 или 75

Console.WriteLine("Зашифрованное число: " +encrypt);

 

int decrypt = encrypt ^ key; // Результатом будет исходное число 45

Console.WriteLine("Расшифрованное число: " + decrypt);

Здесь опять же производятся поразрядные операции. Если у нас значения текущего разряда у обоих чисел разные, то возвращается 1, иначе возвращается 0. Таким образом, мы получаем из 9^5 в качестве результата число 12. И чтобы расшифровать число, мы применяем ту же операцию к результату.

  • ~ (логическое отрицание или инверсия)

Еще одна поразрядная операция, которая инвертирует все разряды: если значение разряда равно 1, то оно становится равным нулю, и наоборот.

1

2

int x = 12;                 // 00001100

Console.WriteLine(~x);      // 11110011   или -13

Представление отрицательных чисел

Для записи чисел со знаком в C# применяется дополнительный код (two’s complement), при котором старший разряд является знаковым. Если его значение равно 0, то число положительное, и его двоичное представление не отличается от представления беззнакового числа. Например, 0000 0001 в десятичной системе 1.

Если старший разряд равен 1, то мы имеем дело с отрицательным числом. Например, 1111 1111 в десятичной системе представляет -1. Соответственно, 1111 0011 представляет -13.

Чтобы получить из положительного числа отрицательное, его нужно инвертировать и прибавить единицу:

1

2

3

4

int x = 12;

int y = ~x;

y += 1;

Console.WriteLine(y);   // -12

Операции сдвига

Операции сдвига также производятся над разрядами чисел. Сдвиг может происходить вправо и влево.

  • x - сдвигает число x влево на y разрядов. Например, 4 сдвигает число 4 (которое в двоичном представлении 100) на один разряд влево, то есть в итоге получается 1000 или число 8 в десятичном представлении.

  • xy - сдвигает число x вправо на y разрядов. Например, 161 сдвигает число 16 (которое в двоичном представлении 10000) на один разряд вправо, то есть в итоге получается 1000 или число 8 в десятичном представлении.

Таким образом, если исходное число, которое надо сдвинуть в ту или другую строну, делится на два, то фактически получается умножение или деление на два. Поэтому подобную операцию можно использовать вместо непосредственного умножения или деления на два.