c#移位元運算符("<<"及">>")詳細說明

來源:互聯網
上載者:User

標籤:

  以前感覺移位元運算符自己挺明白的,也許是學的時間長了,後來一看,忘得差不多了。現在參考一些網上的學習資料,將位移運算子整理一下,作為知識點總結,也算個積累。在講移位元運算符之前,先簡單補充一下原碼與補碼的知識。

一.原碼與補碼

  在電腦系統中,數值一律用補碼來儲存(表示)。主要原因:使用補碼,可以將符號位和其他位統一處理;同時減法也可按加法來處理。另外,兩個補碼錶示的數相加時,如果最高位(符號位)有進位,則進位被捨棄。

  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

 

c#移位元運算符("<<"及">>")詳細說明

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.