c 中的左移 右移運算

2021-08-31 22:22:27 字數 760 閱讀 8555

**:

今天在看x264的源**時,發現裡面大量應用了">>"運算子,看書的時候注意過這個細節,不過在工作中一直沒有用到,也沒記住。重新查了k&r,裡面說無符號數的移位總是用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++編譯器來說,都是按照上面所講實現的。

c 中的左移 右移運算

今天在看x264的源 時,發現裡面大量應用了 運算子,看書的時候注意過這個細節,不過在工作中一直沒有用到,也沒記住。重新查了k r,裡面說無符號數的移位總是用0填充,而對於有符號數,則與機器的具體實現有關。如果用0填充,那麼這種填充方式稱為 logical shift 若用符號位填充,則稱為 ari...

c 中的左移 右移運算

移位運算包含 邏輯移位 logical shift 和 算術移位 arithmetic shift 邏輯移位 移出去的位丟棄,空缺位 vacant bit 用 0 填充。算術移位 移出去的位丟棄,空缺位 vacant bit 用 符號位 來填充,所以一般用在右移運算中。c 中,整數分有符號數和無符號...

c 中的左移 右移運算

移位運算包含 邏輯移位 logical shift 和 算術移位 arithmetic shift 邏輯移位 移出去的位丟棄,空缺位 vacant bit 用 0 填充。算術移位 移出去的位丟棄,空缺位 vacant bit 用 符號位 來填充,所以一般用在右移運算中。c 中,整數分有符號數和無符號...