C語言之移位操作


     C語言很多操作都是以字節為單位進行的,但有時為了節約空間,很多系統程序中要求在比特位級別進行運算處理。C語言一同提供了六種位運算的運算符,分別為&(按位與),|(按位或),~(按位取反),^(按位異或),<<(左移),>>(右移)。本次我們就進行移位操作的分析,看看在不同情況下移位操作的情形。

(1)變量為正數的情形

        當變量為正數的時候,無論左移還是右移,移動溢出的位丟棄,剩下的位補的都是0。

        1.當移位的位數大於,0,並且小於所定義的類型的位數(如變量為整型,那他移位的范圍在0~32之間)(左移和右移)

          按照正常的情況處理,即將變量的二進制位移動相應的位數,然后在空出來的位上補零即可。

         2。當移位的位數大於0,並且超出了所定義類型的位數(左移和右移)

         將所移動的位數除以32取得的余數即為移位的位數,按照步驟一執行。

(2)變量為負數的情形

        1.右移正數位,且右移位數小於所定義類型的位數        負數的右移與正數的右移規則一樣,唯一不同的是正數右移左邊補得是0,而負數右移左邊補的是1,即符號(傳說中的符號移位)。由於是負數,在計算機中以補碼存儲,即二進制的原碼取反加1.然后以移位規則進行移位。即將所求的的補碼向右移動相應的位數,左邊空出來的位都用1來補齊。然后將這個補碼的結果還原成原碼即為所求。

        2.右移正數位,並且右移的位數大於所定義類型的位數

        將所移動的位數除以32所取得的余數即為移位的位數,然后操作上面1.的過程。

        3.左移正數位(移動位數小於所定義類型的位數,移動位數大於所定義類型的位數)

         負數左移與正數左移一樣,左移右邊補0.區別是,負數在計算機中以補碼存在。一味地過程是對負數求補碼,進行移位后,再將補碼結果還原成原碼即為所求。

(3)移動的位數為負時

         1.右移負位數(移動位數的絕對值小於所定義類型的位數)

          右移負數位,實則是向相同的方向移動所定義類型的位數與所移動位數的絕對值之差,如果右移-31位,即32-|-31|=1,相當於右移了1位。只要知道如何將其移動的負數位轉化為相應移動的整數位后,就可以按照相應的移位步驟進行移位了。

          2.右移負數位(移動位數的絕對值大於所定義類型的位數)

          一旦右移負數位的絕對值超過所定義類型的位數時,要將其進行取模,把范圍控制在所定義的類型位數之內,如果右移-33位,即|-33|%32=1,相當於右移-1位,根據上面的講解,右移-1位就是右移31位。

         3.左移負數位

          同上面1,2。

一個小技巧:value(value不能是負數)向右移動n(n小於所定義類型位數)位,其結果等於value/2^n,value向左移動n(n小於所定義類型的位數)位,其結果等於value*2^n.

 


免責聲明!

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



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