菜雞的Java課筆記 第四
數學運算子,邏輯運算,三目運算,位運算
double d2 = 314e2; //採用科學計數法的寫法,表示10的2次方。= 31400.0
程式碼寫的越簡單越好簡化運算子
程式碼:x=x+y 可以變成x+=y
求模(%)
++(自增)〈++變數:表示先進行變數的自增1,而後再利用變數進行操作〉〈變數++:表示先使用變數的內容進行計算,而後自增〉,--(自減)
int a = 3; int b = a++; //執行完後,b=3。先給b賦值,再自增。 int c = ++a; //執行完後,c=5。先自增,再給b賦值System.out.println(a); System.out.println(b); System.out.println(c)
三目運算子
三目運算子是一個具備帶邏輯驗證條件的賦值操作,可以執行一些布林判斷,而後根據布林的結果進行賦值,其使用語法如下:資料型別 變數名稱 = 布林表示式?滿足表示式時內容;不滿足表示式時的內容
public class TestDemo{ public static vold main(Srting [] args){ int x = 10; int y = 3;// 希望將x或y的最大值賦值給result變數 // 首先要判斷 x與 y 大小關係,如果x大於 y ,則將x的內容賦予result,否則將y的值賦予給result int result = x>y?x:y; System.out.println(result); } }
關係與邏輯運算
如果說關係運算符肯定:>,<,>=,<=,==(等於),!=(不等於)
但是很多情況下對於關係判斷可能有多個一起進行,那麼這就需要使用到邏輯運算子:與(&&(短路與),&(普通與))所有的條件同時滿足時,或(||(短路或),|(普通或))有一個條件滿足即可,非(!)整體求反,true變false,false變true。
與有兩種操作,單(&)和雙(&&):與運算的特點:(單與(&)的特點)所有的判斷條件都必須返回true才會返回true,只要有一個false,都是false。(雙與(&&)的特點)只要判斷前面的運算不出錯就是對的。
或的兩種操作:特點:若干個條件只要有一個是返回true,其結果就是true,如果說現在有若干個條件,其中前面有一個條件返回了true,那麼最終的結果就是true。所以為了提高判斷效能,可以使用 短路或 的方式處理。
通過分析可以發現,在進行 與 和 或 的操作過程中,一定要使用“&&”或者是“||”,而不要使用其他的 普通與,普通或 操作。
位操作
位主要指進行二進位制的資料操作。對於位操作首先要解決的問題是如何將十進位制資料轉為二進位制資料。資料的依據:數字除2取餘或者叫取摸,而後倒序整理。
在JAVA中提供的位運算,主要有:&,|,^,~,>>,<<
<< 左 相當於乘2 後者 除2
在進行(&)運算時,只有兩個數字都是 1 的情況下才會得出1 的結果,否則為0
或(|)其值要求中一個為1 時 結果就為1,兩個0 時 才會是0
異或(^)只有兩個位上比較的數不一樣的時候結果才為1,只要一樣就為0
/* //測試位運算 int m = 8; int n = 4; System.out.println(m&n); // 0 System.out.println(m|n); //12 System.out.println(~m); //-9 System.out.println(m^n); // 12 int a = 3*2*2; int b = 3<<3; //相當於:3*2*2; int c = 12/2/2; int d = 12>>2; System.out.println(a); //12 System.out.println(b); //24 System.out.println(c); //3 System.out.println(d); //3 boolean b1 = true&false; System.out.println(b1); //false */
面試題:請解釋“&”和“&&”,“|”和“||”的關係。
在邏輯運算中,
與 操作表示判斷的若干條件要同時返回true,結果才是true;分為兩種:
“&”:所有的判斷條件都要進行判斷,不管前面的判斷結果是什麼
“&&”:在進行條件判斷時,如果前面的條件返回了false,後面的判斷不再進行,屬於短路與;
或 操作表示判斷的若干條件返回一個trur即可,結果就是true,全為false才是false;
“|”:所有的判斷條件都要進行判斷;
“||”:在進行若干個條件判斷時,如果前面有條件返回了true,後面的判斷將不再進行,直接返回true;
在位運算中:
“&”:表示進行位與操作,位與操作中只中有兩個內容為1,結果才是1,有一個為0計算結果為0。
“|”:表示進行位與操作,位與操作中只中有兩個內容有一個為1,結果才是1,全為0計算結果才為0。
總結
編寫程式碼時一定要只寫簡單運算,不要寫複雜的運算。
三目運算最容易被開發者所忽略,但是真的很有用。
多個條件判斷時永遠使用“&&”或者是“||”
----------------------------------------------------------------------------------------------- 運算子 運算子指明對運算元的運算方式。組成表示式的Java操作符有很多種。運算子按照其要求的運算元數目來分,可以有單目運算子、雙目運算子和三目運算子,它們分別對應於1個、2個、3個運算元。運算子按其功能來分,有算術運算子、賦值運算子、關係運算符、邏輯運算子、位運算子和其他運算子。算術 單目:+(取正)-(取負) ++(自增1) - -(自減1) 雙目:+ - * / %(取餘) 三目:a>b?true:false 說明:當a大於b的時候,為true(也就是冒號之前的值),否則為false;這整個運算子包括一個關係運算符(可以是“>”"<""!="等等),一個“?”,一個“:”,冒號前後需要有兩個表示式或者是值或者是物件。 關係 等於符號:==,不等於符號:!= ,大於符號:>, 小於符號:<,大於等於符號:>= ,小於等於符號:<= 。 位與邏輯 位運算子 與(&)、非(!)、或(|)、異或(^) &:雙目運算子,運算時均把運算數轉換為二進位制再做比較,規則:當相同的位上均為1時結果為1,否則結 果為0.如:1010&1101,轉為二進位制:10001001101&1111110010比較結果為:1000000轉為十進位制: 64所以1010&1101=64; | :當兩邊運算元的位有一邊為1時,結果為1,否則為0。如1100|1010=1110 !:0變1,1變0 ^:兩邊的位不同時,結果為1,否則為0.如1100^1010=0110 邏輯運算子 與(&&)、非(!)、或(||) 賦值 = += -= *= /= %= &= ^= |= <<= >>= instanceof 該運算子是雙目運算子,左面的操作元是一個物件,右面是一個類。當左面的物件是右面的類建立的物件時,該運算子運算結果是true,否則是false。 運算子綜述
Java 的表示式就是用運算子連線起來的符合Java 規則的式子.運算子的優先順序決定了表示式中運算執行的先後順序.例如,x運算子號的優先級別,在編寫程式時可儘量的使用括號來實現你想要的運算次序,以免產生難以閱讀或含糊不清的計算順序.運算子的結合性決定了並列相同級別的運算子的先後順序,例如,加減的結合性是從左到右,8-5+3 相當於(8-5)+3.邏輯否運算子 的結合性是右到左, x 相當於!(!x).表3.4是Java所有運算子的優先順序和結合性。 位移 << 帶符號左移 >>帶符號右移 >>> 無號右移 運算子優先順序 按優先順序從高到低排列如下:[ ] ( ) ++ -- ! ~ instanceof * / % + - << >> >>> <> < = > \ == != &^& & || ? := op= 。 強制和轉換 Java語言和直譯器限制使用強制和轉換,以防止出錯導致系統崩潰。整數和浮點數運算子間可以來回強制轉換,但整數不能強制轉換成陣列或物件。物件不能被強制為基本型別。 Java中整數運算子在整數運算時,如果運算元是long型別,則運算結果是long型別,否則為int型別,絕不會是byte,short或char型。這樣,如果變數i被宣告為short或byte,i+1的結果會是int。如果結果超過該型別的取值範圍,則按該型別的最大值取模。 運算子操作
一、運算子"+",如果必要則自動把運算元轉換為String型。如果運算元是一個物件,它可定義一個方法toString()返回該物件的String方式,例如floata=1.0print(“Thevalueofais”+a+“\n”);+運算子用到的例子Strings=“a=”+a;+=運算子也可以用於String。注意,左邊(下例中的s1)僅求值一次。s1+=a;//s1=s1+a//若a非String型,自動轉換為String型。
二、整數算術運算的異常是由於除零或按零取模造成的。它將引發一個算術異常。下溢產生零,上溢導致越界。例如:加1超過整數最大值,取模後,變成最小值。一個op=賦值運算子,和上表中的各雙目整數運算子聯用,構成一個表示式。整數關係運算符<,>,<=,>=,==和!=產生boolean型別的資料。
三、陣列運算子陣列運算子形式如下:[]可給出陣列中某個元素的值。合法的取值範圍是從0到陣列的長度減1。
四、物件運算子雙目運算子instanceof測試某個物件是否是指定類或其子類的例項。例如:if(myObjectinstanceofMyClass){MyClassanothermyObject=(MyClass)myObject;…}是判定myObject是否是MyClass的例項或是其子類的例項。 五、浮點運算子浮點運算子可以使用常規運算子的組合:如單目運算子++、--,雙目運算子+、-、*和/,以及賦值運算子+=,-=,*=,和/=。此外,還有取模運算:%和%=也可以作用於浮點數,例如:a%b和a-((int)(a/b)*b)的語義相同。這表示a%b的結果是除完後剩下的浮點數部分。只有單精度運算元的浮點表示式按照單精度運算求值,產生單精度結果。如果浮點表示式中含有一個或一個以上的雙精度運算元,則按雙精度運算,結果是雙精度浮點數。 六、布林運算子布林(boolean)變數或表示式的組合運算可以產生新的boolean值,fales和true(記得是小寫)。單目運算子!是布林非。雙目運算子&,|和^是邏輯AND,OR和XOR運算子,它們強制兩個運算元求布林值。為避免右側運算元冗餘求值,使用者可以使用短路求值運算子&&和||。 七、使用者可以使用==和!=,賦值運算子也可以用&=、|=、^=。三元條件操作符和C語言中的一樣。 八、++運算子用於表示直接加1操作。增量操作也可以用加運算子和賦值操作間接完成。++lvalue(左值表示lvalue+=1,++lvalue也表示lvalue=lvalue+1。 九、--運算子用於表示減1操作。++和--運算子既可以作為字首運算子,也可以做為字尾運算子。雙目整數運算子是:運算子操作**+加-減*乘/除%取模&位與|位或^位異或<<左移>>右移(帶符號) >>>添零右移整數除法按零舍入。除法和取模遵守以下等式: (a/b)*b+(a%b)==a java運算子
&是位 &&是邏輯 當&兩邊是整數時執行的是位運算,而兩邊是boolean值時執行的是邏輯運算, 如: 3&6 就是執行的位運算,結果是一個整數:2 true&false 執行的就是邏輯運算,結果是一個boolean值:false &的邏輯運算和&&邏輯運算是存在一定不同的 &邏輯運算時兩邊都會計算的,而&&則在左邊為假時則直接返的是false不再計算右邊 舉個例子:
int[] a={1,2,3}; if(a==2&a==4){System.out.println("true")}
int[] a={1,2,3}; if(a==2&&a==4){System.out.println("true")}這兩個例子中,第一個會丟擲異常,而第二個則什麼不會輸出也不會拋異常 這是因為第一個例子中if語句中用的是&,所以兩邊的都會計算,當計算a==4時丟擲陣列下標越界異常 第二個例子則在計算第一個式子a==2發現結果為假則不再計算右邊,直接返回false,所以該例子不會輸出任何東西 。 java中用的最多的一個三目運算子:A=3?b:c; 如果A=3成立的話結果是b,如果不成立的話結果是c; 運算子演示 在Java 中提供運算功能的就是運算子(Operator),算術運算子有加(+)、減(-)、乘(*)、除(/)這類的運算子。另外還有一個很常用的取模運算子(%)。這類以數學運算為主的運算子稱為算術運算子(Arithmetic Operator)。
舉幾個算數運算的例子:
int a = 5+4; //a=9 int b = a*2; //b=18 int c = b/4; //c=4 int d = b-c; //d=14 int e = -d; //e=-14 int f = e%4; //f=-2這裡簡單說一下取模運算子(%),其實就是取除法後的餘數,例子中的int f = e%4,就是-14對4取餘數,結果為-2。與C、 C++不同,對取模運算子%來說,其運算元可以為浮點數, 如 37.2%10=7.2 而且,Java對加運算子進行了擴充套件,使它能夠進行字串的連線,如"abc"+"de",得到字串 "abcde"。但是這只是對於字串連線的簡單擴充套件,字串並不支援諸如減法的其他運算。有趣的是,字元是支援加法和減法的,其參與運算的是這個字元的ASCII碼值。例如b的ASCII碼值比a大1,所以(‘b’-‘a’)的結果就是1。 三個移位 JAVA左移:<<帶符號右移:>> 無符號右移:>>>“ < <”, “> > ”, “> > > ”在Java中是左移、有符號右移和無符號右移運算子。位移運算子只對int值進行操作,如果不是int,編譯器會報錯。在Java中,一個int的長度始終是32bit,也就是4個位元組。 1)左移動運算子: 會將操作的數向左邊移動,移動的位的個數由指定,左移(2)右移動運算子:
反過來,把運算元向右移動,移動的位個數同樣由右運算元指定。(3)無正負號的右移運算子(>>>): 採用0補充,意思就是說
m=-7; System.out.println("m的二 進 制碼是:"+Integer.toBinaryString(m)); System.out.println("m>>2的二進位制碼是:"+Integer.toBinaryString(m>>2)); System.out.println("(m>>2)="+(m>>2)); System.out.println("m<<2的二進位制碼是:"+Integer.toBinaryString(m<<2)); System.out.println("(m<<2)=:"+(m<<2)); System.out.println("m>>>24的二進位制碼是:"+Integer.toBinaryString(m>>>24)); System.out.println(" m>>>24 :"+ (m>>>24));m的二 進 制碼是:1111 1111 1111 1111 1111 1111 1111 1001 m>>2的二進位制碼是:1111 1111 1111 1111 1111 1111 1111 1110 (m>>2)=-2 m<<2的二進位制碼是:1111 1111 1111 1111 1111 1111 1110 0100 (m<<2)=:-28 m>>>24的二進位制碼是:1111 1111 m>>>24 :255 -7的反碼:1111 1111 1111 1111 1111 1111 1111 1000 補碼:1111 1111 1111 1111 1111 1111 1111 1001