分類
在計算機中所有資料都是以二進位制的形式儲存的。位運算其實就是直接對在記憶體中的二進位制資料進行操作,因此處理資料的速度非常快。
符號位:二進位制數最高位表示符號位,0表示正數,1表示負數。
原碼:整數的二進位制數。
反碼:符號位不變,其餘部分取反。
補碼:原碼取反+1,符號位不變。或者說反碼+1,符號位不變。
負數的原碼即為:正數的原碼取反,再加1,即正數的補碼就是負數的原碼。
比如11和-11
11的原碼:00000000 00000000 00000000 00001011
11的反碼:01111111 11111111 11111111 11110100
11的補碼:01111111 11111111 11111111 11110101
-11的原碼:11111111 11111111 11111111 11110101
位操作符分為兩類:
1.按位操作符
2.移位操作符
按位操作符用來操作整數基本資料型別中的單個「位元(bit)」,即二進位制。按位操作符會對兩個引數中的位執行布林代數運算,並最終生成乙個結果。
1.按位「與」操作符(&)
解釋:對兩個整數的二進位制形式逐位進行邏輯與 運算
如果兩個輸入位都是1,那麼按位「與」(&)操作就會生成乙個輸出位1,否則生成乙個輸出位0。
4&-5分析:1&1=1;
1&0=0;
4&-5=0;
4的二進位制:00000000 00000000 00000000 00000100
-5的二進位制:11111111 11111111 11111111 11111011
所以4&-5的二進位制為 00000000 00000000 00000000 00000000
轉換為10進製為0。
所以4&-5=0;
2.按位「或」操作符(|)
解釋:對兩個整數的二進位制形式逐位進行邏輯或運算。
如果兩個輸入位都是1,那麼按位「或」(|)操作符生成乙個輸出位1,只有兩個輸入位都是0的情況下,才會生成乙個輸出位0。
同樣以4|-5為例:1
|0=1;
0|0=0;
4|-5=-1;
4|-5:
4的二進位制:00000000 00000000 00000000 00000100,
-5的二進位制:11111111 11111111 11111111 11111011,
逐位進行邏輯或運算:11111111 11111111 11111111 11111111,即得到-1.
3.按位「異或」操作符(^)
解釋:對兩個整數的二進位制形式逐位進行邏輯異或運算。
如果輸入位的某乙個是1,但不全都是1,那麼按位「異或」(^)操作,生成乙個輸出位1。
4^-5:1^1
=0;1
^0=1;
0^0=0
;4^-5=-
1;
4的二進位制:00000000 00000000 00000000 00000100,
-5的二進位制:11111111 11111111 11111111 11111011,
逐位進行邏輯異或運算:11111111 11111111 11111111 11111111,即得到-1.
4.按位非(~)
解釋:對兩個整數的二進位制形式逐位進行取反。
按位非(~)操作符,也稱為取反操作符。它屬於一元操作符,只對乙個數進行操作(其他按位操作符是二元操作符),按位「非」生成與輸入位相反的值,若輸入0,則輸出1;若輸入1,則輸出0。
~4=-5;
4的二進位制形:00000000 00000000 00000000 00000100,逐位取反後得11111111 11111111 11111111 11111011,即為-5。
移位操作符操作的運算物件也是二進位制的「位」。移位操作符只能用來處理整數型別。移位操作符分為:1.左移位操作符(<<),2.「有符號」右移位操作符(>>),3.「無符號」右移操作符(>>>)。
1.左移位操作符(<<)
例如:4<<2
4的二進位制形式: 00000000 00000000 00000000 00000100,進行左位移2位,得到00000000 00000000 00000000 00001000,即為16.
10737418<<8
10737418二進位制表示形式:00000000 10100011 11010111 00001010,進行左位移2位,得到10100011 11010111 00001010 00000000,即為:-1546188288.
2.有符號右位移操作符(>>)
m>>n的含義:把整數m表示的二進位制數右移n位,m為正數,高位全部補0;m為負數,高位全部補1。
例如 4>>2
4的二進位制形式: 00000000 00000000 00000000 00000100,進行右位移2位,得到00000000 00000000 00000000 00000000,即為1.
-4>>2剖析:
-4二進位制形式: 11111111111111111111111111111100,右移2位,得到11111111 11111111 11111111 11111111,即為-1.
ps:每 個整數表示的二進位制都是32位的,如果右移32位和右移0位的效果是一樣的。依次類推,右移32的倍數字都一樣。相當於整體全移。與移0位相同。左移也是一樣的。
3.無符號右移操作符(>>>)
m>>>n:整數m表示的二進位制右移n位,不論正負數,高位都補零。
例如: 4>>>2:
4二進位制形式: 00000000 00000000 00000000 00000100,右移兩位,得到00000000 00000000 00000000 00000001,即為1。
-4>>>2:
-4二進位制形式: 11111111111111111111111111111100,右移兩位,得到00111111 11111111 11111111 11111111,即為1073741823.
備註
對於移位操作符如果n為負數:這時jvm會先讓n對32取模,變成乙個絕對值小於32的負數,然後再加上32,直到 n 變成乙個正數。
例如:
4<<-10
4的二進位制形式:00000000 00000000 00000000 00000100,-10對32取模再加上32,不用說了,得到22,則4<<-10,即相當於4<<22。
此時按照再左移22位,得到00000001 00000000 00000000 00000000,得到的即為:16777216。
4.其他非整型數值位移處理
如果對char,byte或者short型別的數值進行位移處理,那麼在移位之前會,它們會被轉為int型別,並且得到的結果也是int型別的值。只有數值有段的低5位才有用。這樣可以防止我們移位超過int型所具有的位數。(2的5次方等於32,int只有32位)。
「移位」可以與「等號」(<<=或》=或》=組合使用)。此時,操作符左邊的值會移動指定的位數,然後將結果複製給左邊的變數。但在進行「無符號」右移位集合結合賦值操作時,會出現乙個問題:如果對byte或short值進行這樣的移位運算,得到的可能不是正確的結果。它們會先被轉成int型別,然後進行右移操作,然後被截斷,再賦值給原來的型別。
例如:
輸出的結果為public
static
void
main(string args)
-4 -4
508
這說明了在操作a <<= 2 執行過程是這樣的:先將 byte型的數 127變成int型,左移2位得到 508,然後把508賦給byte型變數a時只是簡單地」折斷」(truncate)得到數-4。編譯時編譯器不會提示你可能損失精度(實際上在本例中確實是損失精度了)。
異常使用 ThinkingInJava
1.在恰當的級別處理問題。在知道該如何處理的情況下才捕獲異常 2.解決問題並且重新呼叫產生異常的方法。3.進行少許修補,然後繞過異常發生的地方繼續執行。4.用別的資料進行計算,以代替方法預計會返回的值。5.把當前執行環境下能做的事情盡量做完,然後把相同的異常重拋到更高層。6.把當前執行環境下能做的事...
Thinking in java 學習筆記(二)
5.4 類訪問 對於類的訪問只有兩種 友好 沒有修飾符,包內可見 和public 5.6 內部類可以相互訪問protected修飾的方法和資料,private修飾的方法和資料不能訪問,友好 修飾的方法和資料可以相互訪問。protected 它本身是私有的,但可由從這個類繼承的任何東西或者同乙個包內的...
4 ThinkingInJava學習筆記
今天的學習筆記,一天一記 1.建構函式只能在構造器中呼叫,而且只能呼叫最多乙個建構函式。2.如果乙個類沒有實現構造器,那麼就有乙個預設構造器 無參 如果實現了乙個構造器之後,必須有乙個無參構造器。3.finalize 函式釋放資源不靠譜,對於占用的一些系統資源比如檔案控制代碼等,最好還是自己實現乙個...