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);