1. 程式人生 > >說說&和&& |和||的區別 及關於位操作符的使用和總結

說說&和&& |和||的區別 及關於位操作符的使用和總結

參考資料:

張孝祥老師整理的Java就業面試題大全

Java開發實戰經典(李興華老師)

及http://hi.baidu.com/onjee/blog/item/4e902d1f3450040f304e15ca.html

package src;

/** 本示例演示&和&& |和||聯絡與區別 by: fasttime 2010-12-12 * */
public class LogicAnd {
public static void main(String[] args) {
/***********************************************************************
* &和&&都可以做為邏輯與的運算子,表示邏輯與(and),當兩邊的表示式結果都為true時
* 整個結果才為true,否則只有一方為false,則結果為false
* &&還具有短路的功能,如第一個表示式為false,則不會執行第二個表示式
**********************************************************************/

/** 例: */
try {
String str = null;
if (str != null && str.equals("")) {
/**
* 當str為null時,後面的表示式,不會執行.所以不會出現,NullPointerException
* 如將&&改為&,則會丟擲空指向異常
*/
System.out.println("test &和&&的區別");

} else {
System.out.println("test &和&&的區別");
}

} catch (Exception e) {
e.printStackTrace();
}
/**
* 注意點: &操作符在if或其它流程控制語句中需要兩邊都為Boolean表示式.
* 否則只能當位操作符使用.
* &和&&在含有自增或自減的表示式中的區別
*/
int it = 1, yt = 1,iy=1,yu=1;
if (it == 2 & ++yt > 0) {
// 此時y會增長
}
System.out.println("yt的值為(採用&): " + yt);
if (iy == 2 && ++yu > 0) {
//此時y不會增長
}
System.out.println("yu的值為(採用&&): " + yu);

/**關於|和||的區別
* |->or 或
* ||->短路或
* */
boolean b1=true;
boolean b2=false;
int b3=1;
System.out.println("b1||b2: "+(b1||b2));
System.out.println("b1|b2: "+(b1|b2));
/**通過以上程式碼,我們得知,就算第一表達式為false,採用&操作符的話,也會執行第二表示式*/

/**
* &還可以做為位運算子,當&操作符兩邊的表示式不是Boolean型別時,&表示按位與操作,
* 我們通常使用0x0f來與一個整數進行&運算,來獲取該整數的的最低4個bit位
*/
/**
* Java中有4個位運算子:
* & 按位與(都是1才是1)
* | 按位或(有1就是1)
* ^ 按位異或(相同為0,不同為1)
* ~ 按位取反(0變1,1變0)
*
* */


/**首先介紹下進位制問題:
* 二進位制(範圍0-1)->內部(電腦)、八進位制(範圍0-7)->鍵盤編碼
* 十進位制(範圍0-9)->生活中,如:阿拉伯數字
* 十六進位制(範圍0-9ABCDEF)其中A表10、依此類推->顏色
* 字首0x表十六進位制進位制,字首0代表八進位制
* 將十六進位制0x31轉換為二進位制為:
* 採用1位換4位的形式,如: 3-->0011而1-->0001
* 0000 0000 0000 0000 0000 0000 0011 0001-->所對應的16進製為0x31,二進位制為:49
* 0000 0000 0000 0000 0000 0000 0000 1111-->所對應的16進製為0x0f,二進位制為:15
* 按位與處理兩個長度相同的二進位制數, 兩個相應的二進位都為1,
* 該位的結果值才為1,否則為0(都是1才是1)
* 0000 0000 0000 0000 0000 0000 0000 0001-->所對應的二進位制為1
*
* 按位或處理兩個長度相同的二進位制數, 兩個相應的二進位中只要有一個為1,
* 該位的結果值為1.(有1則為1)
* 0000 0000 0000 0000 0000 0000 0011 0001-->所對應的16進製為0x31,二進位制為:49
* 0000 0000 0000 0000 0000 0000 0000 1111-->所對應的16進製為0x0f,二進位制為:15
* 兩個相應的二進位中只要有一個為1, 該位的結果值為1.
* 0000 0000 0000 0000 0000 0000 0011 1111-->所對應的二進位制為63
* */
System.out.println(0x31&0x0f);//所對應的二進位制為1,請看上面的解釋
System.out.println(0x31|0x0f);//所對應的二進位制為63,請看上面的解釋
/**
* 按位異或運算, 對等長二進位制模式或二進位制數的每一位執行邏輯異或操作.
* 操作的結果是如果某位不同則該位為1, 否則該位為0(相同為0,不同為1)
* 0000 0000 0000 0000 0000 0000 0011 0001-->所對應的16進製為0x31,二進位制為:49
* 0000 0000 0000 0000 0000 0000 0000 1111-->所對應的16進製為0x0f,二進位制為:15
* 0000 0000 0000 0000 0000 0000 0011 1110-->所對應的二進位制為62
* */
System.out.println(0x31^0x0f);
/**
* 取反是一元運算子, 對一個二進位制數的每一位執行邏輯反操作. 使數字1成為0, 0成為1.
* 0000 0000 0000 0000 0000 0000 0000 1111-->所對應的16進製為0x0f,二進位制為:15
* 1111 1111 1111 1111 1111 1111 1111 0000-->所對應的二進位制為-16
* 注:將最高位作為符號位(1為負,0為正),其餘各位代表數值本身的絕對值(二進位制表示)
* */
System.out.println(~0x0f);
/**關於java中直接對十進位制進行取反操作
* 10的二進位制為:
* 0000 0000 0000 0000 0000 0000 0000 1010
* 1111 1111 1111 1111 1111 1111 1111 0101-->取反後的二進位制為: -9
* */
System.out.println(~0010);

/**疑問: 如果直接對10進行取反操作,如:~10結果為什麼是-11
* 好象對整數進行取反操作都會加1,如:~13結果為-14,其它數字也一樣.
* 原理是什麼?
* 通知參考李興華老師的書籍得知:
* 在計算機的資料表示中只定義了正數的表示形式,並沒有定義負數的表示形式,所以,
* 負數一般都用補碼的形式表示,正數的原碼、反碼、補碼都相同,負數的反碼是除符號位為1外
* 其它位全取反: 補碼就是 "反碼+1"
* */
System.out.println(~13);//反碼+1=-14
System.out.println(~-3);//反碼+1=2

/**順便也總結下左位移<<和右位移>>及無符號右位移>>>*/
//>>是將運算子的二進位制碼整體右移,右移之後空出來的位置以符號位填允
//如果是正數則使用0填充,如果說是負數則使用1填充
int x=3,y=-3;
System.out.println(x+"右移2位之後的內容: "+(x>>2));
System.out.println(y+"右移2位之後的內容: "+(y>>2));
/**
* 0000 0000 0000 0000 0000 0000 0000 0011 //3的二進位制
* 0000 0000 0000 0000 0000 0000 0000 0000 //移出2位後,結果為0
*
* 1111 1111 1111 1111 1111 1111 1111 1101 //-3的二進位制
* 1111 1111 1111 1111 1111 1111 1111 1111 //右移2位後,結果為-1
* */

//>>>無符號右位移,採用此操作將以0填充空出來的位->就是說不管正負都採用0填充空位
System.out.println(x+"無符號右移2位之後的內容: "+(x>>>2));
System.out.println(y+"無符號右移2位之後的內容: "+(y>>>2));

//總結: 對於位操作運算子,只適用於byte、short、int、char、long型別
/*介紹:
* 計算機由複雜電子元器件構成,一個電子元器件有帶電和不帶電的兩種狀態,1和0
多個這樣的元器件的組合可以表示更多狀態,也就是可以表示更多的資料,
一個元器件可以表示一位(bit)資料,這種表示資料的方式稱為2進位制
在實際的電子裝置中,將8個元器件組合在一起,形成一個單元,這樣的單元叫做一個位元組(byte)
一個位元組能表示2^8=256個數,即0-255
2個位元組能表示2^16個數,即0-2^16-1
4個位元組能表示2^32個數,即0-2^32-1
一個位元組(byte)由8個二進位(bit)組成,
最右邊的稱為最低有效位,最左邊的稱為最高有效位
每一個二進位的值都是0或1*/
/*在計算機中常採用16位進位制的方法,因為二進位制書寫太長,容易出錯
16進位制的f代表十進位制中的15,在二進位制中需要4位(bit)1111來書寫
16進制中的ff代表十進位制的255,在二進位制中需要8位(bit)11111111來書寫*/

// 在計算機中只有數值,可以用數值表示不同的含義,如記憶體的數值可代表不同的含義

}
}