在學習源碼中,發現有大量使用位運算符,這樣作的目的是爲了節約內存開銷和加快計算效率。html
位運算符,這個」位」表明這什麼?數據結構
位:二進制位簡稱「位」,是二進制記數系統中表示小於2的整數的符號,通常用1或 0表示,是具備相等機率的兩種狀態中的一種。二進制位的位數可表示一個機器字的字長,一個二進制位包含的信息量稱爲一比特。摘自百度百科學習
int類型佔4個字節(byte);3d
一個字節=8bit(位);cdn
一個int類型的數值佔32bit(位)htm
int i = 123; 10進制123轉爲二進制後等於:1111011 完整補位後:00000000 00000000 00000000 01111011blog
二進制的最高位爲符號位,1表明負數,0表明正數,其他位表示數的絕對值內存
123轉爲二進制補齊後爲:00000000 00000000 00000000 01111011,這是123的原碼。 負數的原碼按照絕對值轉爲二進制後,最高位補1。 -123的原碼:10000000 00000000 00000000 01111011get
反碼:正數的反碼和原碼相同,負數的反碼爲原碼除最高位外取反(0變1,1變0)。源碼
補碼:正數的反碼和原碼相同,負數的補碼爲原碼除最高位外取反+1。
123的原碼:00000000 00000000 00000000 01111011 123的反碼:00000000 00000000 00000000 01111011 123的補碼:00000000 00000000 00000000 01111011
-123的原碼:10000000 00000000 00000000 01111011 -123的反碼:11111111 11111111 11111111 10000100 -123的補碼:11111111 11111111 11111111 10000101
已知補碼求解碼 最高位若是是1的話(負數),那麼除了最高位以外的取反,而後加1得原碼。
最高位若是是0的話,不變,正數的補碼就是他的原碼。摘自
在計算機系統中,數值一概用補碼來表示和存儲。緣由在於,使用補碼,能夠將符號位和數值域統一處理;同時,加法和減法也能夠統一處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不須要額外的硬件電路。 摘自百度百科
打個比方:2-1是怎麼計算的?
2-1=2+(-1); 2的補碼: 00000010 -1的補碼:11111111 結果0 00000001,最高位溢出丟棄2-1 = 1。 有關原碼反碼補碼學習討論能夠參考: 原碼、反碼、補碼的產生、應用以及優缺點有哪些? 原碼, 反碼, 補碼 詳解
舉個例子:
log:i2=0;
&比較的是boolean表達式時,右邊表達式的執行不受左邊結果影響,因此當i<8不成立後,仍是會執行i2++。結果i2=0,i<8不成立if語句裏面代碼未能執行。
&比較的是數值時,相對應位都是1,則結果爲1不然爲0。
21&-1 = 21; 正數補碼和原碼相同因此沒必要再轉換。負數需除最高位取反後+1得原碼。
按上面的例子,比較boolean表達式時左右兩邊都會執行,有一個爲真則真。
| 比較數值時,相對應位都是0則結果爲0,不然爲1。
-21|-1 = -1;
相對應位值相同則結果爲0,不然爲1
-21^-1 = 20;
~位運算符將每一位取反
~21 = -22;
~-22 = 21;
「有符號」左移<< 符號擴展機制值爲正,則在高位補0,若是值爲負,則在高位補1
22<<3 = 176;
「有符號」右移>>
-22>>4 = -2;
「無符號」右移>>>採用0擴展機制不管值的正負,都在高位補0
-22>>>4 = 268435454;
閱讀更多