C# 4.0: полное руководство | страница 74
>// Продемонстрировать применение операторов сдвига.
>using System;
>class ShiftDemo {
> static void Main() {
> int val = 1;
> for(int i = 0; i < 8; i++) {
> for(int t=128; t > 0; t = t/2) {
> if((val & t) != 0) Console.Write("1 ");
> if((val & t) == 0) Console.Write("0 ");
> }
> Console.WriteLine();
> val = val << 1; // сдвиг влево
> }
> Console.WriteLine() ;
> val = 128;
> for(int i = 0; i < 8; i++) {
> for(int t=128; t > 0; t = t/2) {
> if((val & t) != 0) Console.Write("1 ");
> if((val & t) == 0) Console.Write("0 ");
> }
> Console.WriteLine();
> val = val >>1; // сдвиг вправо
> }
> }
>}
Результат выполнения этой программы выглядит следующим образом.
>0 0 0 0 0 0 0 1
>0 0 0 0 0 0 1 0
>0 0 0 0 0 1 0 0
>0 0 0 0 1 0 0 0
>0 0 0 1 0 0 0 0
>0 0 1 0 0 0 0 0
>0 1 0 0 0 0 0 0
>1 0 0 0 0 0 0 0
>1 0 0 0 0 0 0 0
>0 1 0 0 0 0 0 0
>0 0 1 0 0 0 0 0
>0 0 0 1 0 0 0 0
>0 0 0 0 1 0 0 0
>0 0 0 0 0 1 0 0
>0 0 0 0 0 0 1 0
>0 0 0 0 0 0 0 1
Двоичные разряды соответствуют форме представления чисел в степени 2, и поэтому операторы сдвига могут быть использованы для умножения или деления целых значений на 2. Так, при сдвиге вправо целое значение удваивается, а при сдвиге влево — уменьшается наполовину. Разумеется, все это справедливо лишь в том случае, если крайние разряды не теряются при сдвиге в ту или иную сторону. Ниже приведен соответствующий пример.
>// Применить операторы сдвига для умножения и деления на 2.
>using System;
>class MultDiv {
> static void Main() {
> int n;
> n = 10;
> Console.WriteLine("Значение переменной n:
>" + n) ;
> // Умножить на 2.
> n = n << 1;
>
>
> Console.WriteLine("Значение переменной n: после " +
>
>
> "операции n = n * 2: " + n) ;
> // Умножить на 4.
> n = n << 2;
>
>
> Console.WriteLine("Значение переменной n: после " +
>
>
> "операции n = n * 4: " + n) ;
> // Разделить на 2.
> n = n >> 1;
>
>
> Console.WriteLine("Значение переменной n: после " +
>
>
> "операции n = n / 2: " + n) ;
>
> // Разделить на 4.
>
> n = n >> 2;
>
>
>
> Console.WriteLine("Значение переменной n: после " +
>
>
>
> "операции n = n / 4: " + n) ;
> Console.WriteLine();
> // Установить переменную n в исходное состояние,
> n = 10;
> Console.WriteLine("Значение переменной n: " + n);
> // Умножить на 2 тридцать раз.
> n = n << 30; // данные теряются
> Console.WriteLine("Значение переменной n после " +
> "сдвига на 30 позиций влево: " + n);