>")" type="hidden"/>

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM