Java位運算符淺析

在學習源碼中,發現有大量使用位運算符,這樣作的目的是爲了節約內存開銷和加快計算效率。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;

閱讀更多

來自Google大佬的幾點寫簡歷的意見

Java高級進階,你必需要掌握這些數據結構

除了敲代碼,你還有什麼副業嗎?

我就死磕安卓了,怎麼了?

相關文章
相關標籤/搜索