1. 程式人生 > >c++中的左移、右移運算

c++中的左移、右移運算

今天在看X264的原始碼時,發現裡面大量應用了">>"運算子,看書的時候注意過這個細節,不過在工作中一直沒有用到,也沒記住。重新查了K&R,裡面說無符號數的移位總是用0填充,而對於有符號數,"<<"是用0填充的,“>>”則與機器的具體實現有關。如果用0填充,那麼這種填充方式稱為“logical shift”,若用符號位填充,則稱為“arithmetic shift”。在IBM PC彙編裡面,好像就有兩個彙編指令對應這兩個操作。看了下面的這篇文章,作者應該認為X86裡基本都是arithmetic shift,結合我手邊的程式碼,我也傾向於這種觀點。

移位運算包含“邏輯移位”(logical shift)和“算術移位”(arithmetic shift)。

邏輯移位:移出去的位丟棄,空缺位(vacant bit)用 0 填充。

算術移位:移出去的位丟棄,空缺位(vacant bit)用“符號位”來填充,所以一般用在右移運算中。

  c++中,整數分有符號數和無符號數兩種,對於這兩種數做左移、右移運算,稍有區別:

1、如果是無符號數,不管是左移還是右移都是“邏輯移位” 

例如,分別對無符號數 179 做左移、右移操作的結果,

  

                                                                                  圖1 邏輯左移

 圖2 邏輯右移

2、如果是有符號數,

2a,如果是做左移運算,那麼做的是“邏輯移位”,同 1中無符號數的左移。

2b,如果是做右移運算,那麼做的是“算術移位”。

例如:

  

圖3 負數的右移

圖4 正數的右移

    對於當前的大多數c/c++編譯器來說,都是按照上面所講實現的。