Результат выполнения этой программы выглядит следующим образом.
00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000
10000000
01000000
00100000
00010000
00001000
00000100
00000010
00000001
Двоичные разряды соответствуют форме представления чисел в степени 2, и поэтому операторы сдвига могут быть использованы для умножения или деления целых значений на 2. Так, при сдвиге вправо целое значение удваивается, а при сдвиге влево — уменьшается наполовину. Разумеется, все это справедливо лишь в том случае, если крайние разряды не теряются при сдвиге в ту или иную сторону. Ниже приведен соответствующий пример.
// Применить операторы сдвига для умножения и деления на 2.
using System;
class MultDiv {
static void Main() { int n;
n = 10;
Console.WriteLine('Значение переменной n: ' + n) ;
// Умножить на 2.
n = n << l^-
Console.WriteLine ();
// Установить переменную n в исходное состояние, n = 10;
Console.WriteLine('Значение переменной n: ' + n);
// Умножить на 2 тридцать раз. n = п << 30; // данные теряются
Console.WriteLine('Значение переменной п после ' +
'сдвига на 30 позиций влево: ' + п);
}
}
Ниже приведен результат выполнения этой программы.
Значение переменной п после сдвига на 30 позиций влево: -2147483648
Обратите внимание на последнюю строку приведенного выше результата. Когда целое значение 10 сдвигается влево тридцать раз подряд, информация теряется, поскольку двоичные разряды сдвигаются за пределы представления чисел для типа int. В данном случае получается совершенно ''непригодное7' значение, которое оказывается к тому же отрицательным, поскольку в результате сдвига в старшем разряде, используемом в качестве знакового, оказывается 1, а следовательно, данное числовое значение должно интерпретироваться как отрицательное. Этот пример наглядно показывает, что применять операторы сдвига для умножения или деления на 2 следует очень аккуратно. (Подробнее о типах данных со знаком и без знака см. в главе 3.)
Поразрядные составные операторы присваивания
Все двоичные поразрядные операторы могут быть использованы в составных операциях присваивания. Например, в двух приведенных ниже операторах переменной х присваивается результат выполнения операции исключающее ИЛИ над первоначальным значением переменной х и числовым значением 127.
х = х л 127; х л= 127;
Оператор ?