在搞懂<<、>>、>>>之前,我們需要先了解二進制中的源碼、反碼、補碼...
二進制中的原碼、反碼、補碼
有符號數:
對於有符號數而言,符號的正、負機器是無法識別的,但由於“正、負”恰好是兩種截然不同的狀態,如果用“0”表示“正”,用“1”表示“負”,這樣符號也被數字化了,並且規定將它放在有效數字的前面,即組成了有符號數。所以,在二進制中使用最高位(第一位)來表示符號,最高位是0,表示正數;最高位是1,表示負數。
100000000000000001111100
無符號數:
無符號數是針對二進制來講的,無符號數的表數范圍是非負數。全部二進制均代表數值(所有位都用於表示數的大小),沒有符號位。即第一個"0"或"1"不表示正負
000000000000000001111100
對於有符號數而言的性質:
(1)二進制的最高位是符號位:0表示正數,1表示負數
(2)正數的原碼、反碼、補碼都一樣
(3)負數的反碼 = 它的原碼符號位不變,其他位取反(0 ->1 ; 1->0 )
(4)負數的補碼 = 它的反碼 +1
(5)0的反碼、補碼都是0
(6)在計算機運算的時候,都是以補碼的方式來運算的
有符號數運算案例
- 正數相加:
例如:1+1 ,在計算機中運算如下:
1的原碼為: 00000000 00000000 00000000 00000001
反碼: 00000000 00000000 00000000 00000001
補碼: 00000000 00000000 00000000 00000001
兩數的補碼相加: 00000000 00000000 00000000 00000010
( 轉換為10進制) = 2
- 正數相減:
例如:1 - 2,在計算機中運算如下:
在計算機中減運算其實是作為加運算來操作的,所以,1-2 = 1 + ( -2 )
-
第一步:獲取1的補碼
00000000 00000000 00000000 00000001
-
第二步:獲取-2的補碼
-2的原碼:10000000 00000000 00000000 00000010
-2的反碼:11111111 11111111 11111111 11111101
-2的補碼: 11111111 11111111 11111111 11111110
- 第三步:1的補碼與-2的補碼相加:
00000000 00000000 00000000 00000001
+ 11111111 11111111 11111111 11111110
= 11111111 11111111 11111111 11111111
- 第四步:將計算結果的補碼轉換為原碼,反其道而行之即可(如果想將二進制轉換為十進制,必須得到二進制的原碼)
補碼:11111111 11111111 11111111 11111111
=
反碼:11111111 11111111 11111111 11111110
=
原碼:10000000 00000000 00000000 00000001
第五步:將計算結果的二進制原碼 轉換 為十進制
二進制原碼:10000000 00000000 00000000 00000001
= -1
<< 、>>、>>> 位移運算符
<< 左移運算符
左移一位
左移一位后的數值經過計算可以發現剛好值位移前數值的兩倍,等價於乘2操作,在很多情況下可以當做乘2使用,但是並不代表真正的乘2,在一些特殊情況下並不等價
左移18位
此時二進制首位為1,此時數值為 -1058799616,同理,如果左位移20位,則值為 59768832 又變成了正數
注意:所以根據這個規則,如果任意一個十進制的數左位移32位,右邊補位32個0,十進制豈不是都是0了?當然不是!!! 當int 類型的數據進行左移的時候,當左移的位數大於等於32位的時候,位數會先求余數,然后用該余數進行左移,也就是說,如果真的左移32位的時候,會先進行位數求余數,即為左移32位相當於左移0位 ,所以左移 33 的值和左移一位1 是一樣的
>> 右移運算符
100 帶符號右移
100 源碼補碼均為:00000000 00000000 00000000 01100100
右移四位: 00000000 00000000 00000000 00000110
結果為:6
-100 帶符號右移
-100原碼: 10000000 00000000 00000000 01100100
-100補碼: 保證符號位不變,其余位置取反並加1
11111111 11111111 11111111 10011100
右移4位 : 在高位補1
11111111 11111111 11111111 11111001
補碼形式的移位完成后,結果不是移位后的結果,還需要進行變換才行。其方法如下:
保留符號位,然后按位取反: 10000000 00000000 00000000 00000110
然后加1,即為所求數的原碼: 10000000 00000000 00000000 00000111
結果為:-7
>>> 無符號右移運算符
無符號右移運算符和右移運算符是一樣的,不過無符號右移運算符在右移的時候是補0的,而右移運算符是補符號位的
100 無符號右移 4 位
100 源碼補碼均為:00000000 00000000 00000000 01100100
右移四位: 00000000 00000000 00000000 00000110
結果為:6
-100無符號右移4位
-100原碼: 10000000 00000000 00000000 01100100
-100補碼: 保證符號位不變,其余位置取反並加1
11111111 11111111 11111111 10011100
無符號右移4位 : 在高位補0
00001111 11111111 11111111 11111001
結果為:268435449
總結:正數的左移與右移、無符號右移、負數的無符號右移,就是相應的補碼移位所得,在高位補0即可
負數的右移,就是補碼高位補1,然后按位取反加1即可
此文章為視頻筆記,視頻講解地址