Java 位運算(移位、位與、或、異或、非)

Java提供的位運算符有:左移(<<)、右移(>>)、無符號右移(>>>)、位與(&)、位或(|)、位非(~)、位異或(^),除了位非(~)是一元操作符外,其它的都是二元操作符。1、左移(<<)Test1、將5左移2位:[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5<<2);//運行結果是20}}運行結果是20,但是程序是怎樣執行的呢?首先會將5轉爲2進製表示形式(java中,整數默認就是int類型,也就是32位):00000000000000000000000000000101然後左移2位後,低位補0:00000000000000000000000000010100換算成10進製爲202、右移(>>),右移同理,只是方向不一樣罷了(感覺和沒說一樣)[java]System.out.println(5>>2);//運行結果是1還是先將5轉爲2進製表示形式:00000000000000000000000000000101然後右移2位,高位補0:000000000000000000000000000000013、無符號右移(>>>)我們知道在Java中int類型佔32位,可以表示一個正數,也可以表示一個負數。正數換算成二進制後的最高位爲0,負數的二進制最高爲爲1例如-5換算成二進制後爲:11111111111111111111111111111011(剛開始接觸二進制時,不知道最高位是用來表示正負之分的,當時就總想不通。。明明算起來得到的就是一個正數-_-)我們分別對5進行右移3位、-5進行右移3位和無符號右移3位:[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5>>3);//結果是0System.out.println(-5>>3);//結果是-1System.out.println(-5>>>3);//結果是536870911}}我們來看看它的移位過程(可以通過其結果換算成二進制進行對比):5換算成二進制:000000000000000000000000000001015右移3位後結果爲0,0的二進制爲:00000000000000000000000000000000//(用0進行補位)-5換算成二進制:11111111111111111111111111111011-5右移3位後結果爲-1,-1的二進制爲:11111111111111111111111111111111//(用1進行補位)-5無符號右移3位後的結果536870911換算成二進制:00011111111111111111111111111111//(用0進行補位)通過其結果轉換成二進制後,我們可以發現,正數右移,高位用0補,負數右移,高位用1補,當負數使用無符號右移時,用0進行部位(自然而然的,就由負數變成了正數了)注意:筆者在這裏說的是右移,高位補位的情況。正數或者負數左移,低位都是用0補。(自行測試)4、位與(&)[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5&3);//結果爲1}}還是老套路,將2個操作數和結果都轉換爲二進制進行比較:5轉換爲二進制:000000000000000000000000000001013轉換爲二進制:00000000000000000000000000000011-------------------------------------------------------------------------------------1轉換爲二進制:00000000000000000000000000000001位與:第一個操作數的的第n位於第二個操作數的第n位如果都是1,那麼結果的第n爲也爲1,否則爲05、位或(|)[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5|3);//結果爲7}}5轉換爲二進制:000000000000000000000000000001013轉換爲二進制:00000000000000000000000000000011-------------------------------------------------------------------------------------7轉換爲二進制:00000000000000000000000000000111位或操作:第一個操作數的的第n位於第二個操作數的第n位只要有一個是1,那麼結果的第n爲也爲1,否則爲06、位異或(^)[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5^3);//結果爲6}}5轉換爲二進制:000000000000000000000000000001013轉換爲二進制:00000000000000000000000000000011-------------------------------------------------------------------------------------6轉換爲二進制:00000000000000000000000000000110位異或:第一個操作數的的第n位於第二個操作數的第n位相反,那麼結果的第n爲也爲1,否則爲07、位非(~)位非是一元操作符[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(~5);//結果爲-6}}5轉換爲二進制:00000000000000000000000000000101--------------------------------------------------------------------------------------6轉換爲二進制:11111111111111111111111111111010位非:操作數的第n位爲1,那麼結果的第n位爲0,反之。由位運算操作符衍生而來的有:&=按位與賦值|=按位或賦值^=按位非賦值>>=右移賦值>>>=無符號右移賦值<<=賦值左移和+=一個概念而已。舉個例子:[java]www.2cto.compackagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){inta=5a&=3;System.out.println(a);//結果是1}}作者:xiaochunyong

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章