zoukankan      html  css  js  c++  java
  • c#移位运算符("<<"及">>")

     C#是用<<(左移) 和 >>(右移) 运算符是用来执行移位运算。

      左移 (<<) 

      将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0。
      左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8。

      x<<1= x*2 
      x<<2= x*4 
      x<<3= x*8 
      x<<4= x*16

      同理, 右移即相反:

      右移 (>>) 
      将第一个操作数向右移动第二个操作数所指定的位数,空出的位置补0。

      右移相当于整除. 右移一位相当于除以2;右移两位相当于除以4;右移三位相当于除以8。

      x>>1= x/2 
      x>>2= x/4 
      x>>3= x/8 
      x>>4=x/16

      当声明重载C#移位运算符时,第一个操作数的类型必须总是包含运算符声明的类或结构,并且第二个操作数的类型必须总是 int,如:

      

    复制代码
        class Program
    {
    static void Main(string[] args)
    {
    ShiftClass shift1 = new ShiftClass(5, 10);
    ShiftClass shift2 = shift1 << 2;
    ShiftClass shift3 = shift1 >> 2;

    Console.WriteLine("{0} << 2 结果是:{1}", shift1.valA, shift2.valA);
    Console.WriteLine("{0} << 2 结果是:{1}", shift1.valB,shift2.valB);
    Console.WriteLine("{0} >> 2 结果是:{1}", shift1.valA, shift3.valA);
    Console.WriteLine("{0} >> 2 结果是:{1}", shift1.valB, shift3.valB);

    Console.ReadLine();
    }

    public class ShiftClass
    {
    public int valA;
    public int valB;

    public ShiftClass(int valA, int valB)
    {
    this.valA = valA;
    this.valB = valB;
    }

    public static ShiftClass operator <<(ShiftClass shift, int count)
    {
    int a = shift.valA << count;
    int b = shift.valB << count;
    return new ShiftClass(a, b);
    }

    public static ShiftClass operator >>(ShiftClass shift, int count)
    {
    int a = shift.valA >> count;
    int b = shift.valB >> count;
    return new ShiftClass(a, b);
    }

    }
    }
    复制代码

      以上表达式,输出结果是:

     

      因为位移比乘除速度快.对效率要求高,而且满足2的幂次方的乘除运方,可以采用位移的方式进行。

    转:https://www.cnblogs.com/tjudzj/p/4190878.html

    一.原码与补码

      在计算机系统中,数值一律用补码来存储(表示)。主要原因:使用补码,可以将符号位和其他位统一处理;同时减法也可按加法来处理。另外,两个补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

      1.原码转补码分两种情况

        (1)正数的补码:与原码相同(已知原码求补码)

            例如:+9的原码是0000 1001。补码也是0000 1001。

        (2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反,然后整个数加1。

            例如:-7原码为1000 0111(高位为符号位,1表示负数,0表示正数),补码为1111 1001.

      2.补码转原码也分两种情况(已知补码求原码)

        (1)正数的原码:与补码相同

            例如:+9的补码是0000 1001。原码也是0000 1001。

        (2)负数的原码:符号位为1,其余位为该该补码按位取反,然后整个数加1。

            例如:-7的补码是1111 1001,原码是1000 0111。

    二.移位运算符

      “<<”和“>>”运算符用于执行移位运算,分别称为左移位运算符和右移位运算符。对于X<<N和X>>N形式的运算,含义是将X向左或向右移动N位,得到的结果的类型与X相同。此处,X的类型只能是int,uint、long或ulong,N的类型只能是int,N的类型只能是int,或者显示转换为这些类型之一,否则变异程序时会出现错误。

      1.左移位运算符

        使用左移位(<<)运算符可以将数向左移位。其作用是所有的位都向左移动指定的次数,高次位就会丢失,低位以0来填充。

        注意:如果第一个操作数是int或uint(32位数),则移位数有第二个操作数的低5位给出(原因是:低5位可表示的数的范围是0~24+23+22+21+20,即0~31,足够一个       32位数移位使用),如果第一个操作数是long或ulong(64位数),则移位数由第二个操作数的低6位给出(原因同上)。在左移时,第一个操作数的高序位被放弃,低序空位       用0填充。移位操作从不导致溢出。

        (1)正数左移位(以85为例,可以视作int 、long、uint、ulong之一,此处视为uint类型,32位)

                          85的二进制表示:      0000 0000 0000 0000 0000 0000 0101 0101

            85左移(<<)3位:             0000 0000 0000 0000 0000 0010 1010 1000

            移位后的结果十进制表示:      680

         (2)负数左移位(以-85为例,可以视作int 、long之一,此处视为int,32位)

            -85的二进制补码表示:      1111 1111 1111 1111 1111 1111 1010 1011

            -85左移(<<)3位:        1111 1111 1111 1111 1111 1101 0101 1000

            移位后结果的原码表示:       1000 0000 0000 0000 0000 0010 1010 1000

            移位后的结果十进制表示:     -680

      2.右移位运算符

        右移位运算符(>>)是把数向右移位,其作用是所有的位都向右移动指定的次数。

        注意:如果第一个操作数是int或uint(32位数),则移位数有第二个操作数的低5位给出(原因是:低5位可表示的数的范围是0~24+23+22+21+20,即0~31,足够一个       32位数移位使用),如果第一个操作数是long或ulong(64位数),则移位数由第二个操作数的低6位给出(原因同上)。如果第一个操作数为int或long,则右移位是算数移       位(高序空位设置为符号位)。如果第一个操作数是uint或ulong类型,则右移位是逻辑移位(高位填充0)。

        (1)正数右移位(以85为例,可以视作int 、long、uint、ulong之一,按哪个规则都行)

            85的二进制表示:      0000 0000 0000 0000 0000 0000 0101 0101

            85右移(>>)3位:             0000 0000 0000 0000 0000 0000 0000 1010

            移位后的结果十进制表示:      10

        (2)负数右移位(以-85为例,可以视作int 、long之一,此处视为int,32位)

            -85的二进制补码表示:      1111 1111 1111 1111 1111 1111 1010 1011

            -85左移(>>)3位:        1111 1111 1111 1111 1111 1111 1111 0101

            移位后结果的原码表示:       1000 0000 0000 0000 0000 0010 0000 1011

            移位后的结果十进制表示:     -11

  • 相关阅读:
    网络流 方阵移动
    NOI2019滚粗记
    PKUSC2019游记
    CQOI十二省联考游记
    数学结论题 书堆
    计算几何 大灾变
    51NOD 1773 A国的贸易
    BZOJ 3944
    51Nod 1238
    NOIP2018游记
  • 原文地址:https://www.cnblogs.com/dearzhoubi/p/8873337.html
Copyright © 2011-2022 走看看