移位符,包括左移位符和右移位符,右移位符即“>>”,左移位符即“<<”,箭頭往哪邊指就是哪邊移位。 先說左移位符。 例如 int a = 7; int b = a << 1; 意思就是b等於a左移一位。(以下的例子就是以左移一位講。) 移位符移的是上章所說的補碼的位。 左移位符就是在補碼最右側加一個0,最左側舍去。 如果數字為正,則原碼反碼補碼都一樣,向左移位就相當於在原數字的二進製編碼後麵加了個0。 如果數字為負,則補碼是反碼加一,反碼又是原碼的首字母不變外其餘數字0變1,1變0。 那麼,在移位後,補碼最右側加一個0最左側去一個數(因為是移一位),獲得移位後的補碼,再由補碼逆推出反碼。 逆推出反碼就是在移位後的反碼的基礎上-1。 在獲得反碼後,要獲得原碼,就要將除首數字外的數,0變1,1變0。 獲得的移位後的原碼就是最後幾位就變成了二進製編碼,前麵首字母為1,且其餘位為0。 以此,算出移位後的原碼的後幾位二進製編碼就行了,又因為首字母為1,所以說,移位後還是個負數。 就很神奇,其實求的是原碼的值,但是算的時候得移動補碼。好玩。 右移位符分為算數移位和邏輯移位。 邏輯位移是去掉編碼最右邊的數字,左邊加一個0 算術位移是去掉編碼最右邊的數字,左邊加上原來最左邊相同的數,也就是說,如果原來最左邊是1,那麼最左邊在右移後就添個1,如果最左邊是0,那麼最左邊就添個0。 這樣就更加好玩了,如果補碼首字母是1,那麼就得補碼轉減一轉回反碼,再經過變換得到原碼,再次計算就能獲得值。如果補碼首字母是0,那麼直接計算補碼就行,因為首字母是0,代表右移後的數字,原碼反碼補碼一樣,直接可以算出結果。 實驗證明,VS右移位符的移動方式是算術位移。 即,補碼最右側的數字刪去,最左側添加一個原首數字。
第25章 操作符之移位符(1 / 1)