java運算符
運算符 用來指明對於操作數的運算方式
按照操作數的數目來進行分類
單目 雙目 三目
a++ a+b (a>b)?x:y ;
按照運算符的功能來進行分類
算數運算 + - * / % ++ --
賦值運算 = += -= *= /= %=
關係運算(比較) > >= < <= != ==
邏輯運算 & | ^ ! && ||
位(bit)運算 & | ^ ~ << >> >>>
算數運算
+ - * / %(取餘 去模)
++(自增) --(自減)
int x = 1;
x = x + 1;//x空間內的值 自己增加了一個
x++; // x空間內的值 自增一個
++x; //對於x空間內的值來講 都是一致 最終的結果都自增了一個
int x = 1;
int y = x++; // ++在後 先賦值 後自增(先進行計算 後賦值)
x++; //x = x+1;//將x變量空間的內容先取出 常量區取出1 進行計算 再次存回x空間
x在想要做值交換的時候 會產生一個臨時的副本空間(備份)
++在變量的前面 先自增後備份 ++在變量的後面 先備份後自增
會將副本的值賦給別人
public class Test {
public static void main(String[] args){
int x = 1;
int y = x++;
System.out.println("x : "+x); //2
System.out.println("y : "+y); //1
int xx = 1;
int yy = ++xx;
System.out.println("a : "+a); //2
System.out.println("b : "+b); //2
int a=1;
a=a++;
System.out.println("a : "+a); //1
}
}
賦值運算
= 賦值符號 將=右邊的內容(值 引用)存入=左邊的變量空間內
+= -= *= /= %=
int x = 1;
x+=10; //x=x+10;
思路:
x++;//x自增了一個 需求 讓x增加10個 for循環結構
x++; //x=x+10;
++ for(int i=1;i<=10; i++){
x++ x++;
x++ }
...
int x=1;
x+=2; //?3 x=x+2;
byte x = 1; //1常量32bit =自動轉化
x+=2;//2 x+2 +自動類型提升 3 =自動轉化
x=(byte)(x+2);// 編譯出錯 類型從int轉化成byte可能有損失 此處=後是表達式 =不確定類型 無法自動轉化
x變量空間的值取出 從常量區取過來2 加法運算 結果重新存回x變量空間內
x空間---->1 8bit
常量區--->2 32bit
00000001 + 00000000 00000000 00000000 00000010
+自動類型提升 8bit--32bit
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000010
+00000000 00000000 00000000 00000011 ==3
===================================================
關係運算(比較)
> >= < <= != == (instanceof 比較對象是否是一個類)
1.區分 = 和 ==
=賦值符號 將=後面的結果(值 引用)存入=左邊的變量空間內
==比較符號 比較==前面和==後面的元素(值 引用)是否一致
2.比較運算符的最終結果是什麼?
boolen true false
(3>2)--->true; (3>4)--->false; (3==4)--->false;
(3>=2)--->true; (3>=4)--->false; (3!=4)--->true;
一個條件的判定
邏輯運算
邏輯運算符前後連接的兩個都是boolen的值
邏輯運算最終的結果還是boolen
1.條件 我有時間 同時 2條件 嗓子沒有問題 才能講課
&邏輯與 |邏輯或 ^邏輯異或 !邏輯非
&&短路與 ||短路或
(3>2) & (3>1) 和 並且
true true
true
-------------------------------------------------------------------
(3>5) | (3>4) 或者
false false
false
-----------------------------------------------------------------
(3>2) ^ (3>4) 異(不同的)--->前後兩個結果不一致 就可以
true false
true
(3>2) ^ (3>1)
true true
false
--------------------------------------------------------------------
!(3>2) !true false 非 取反
--------------------------------------------------------------------
(3>4) && (3>2) =?
false && true 與兩個條件同時滿足 如果當第一個條件已經爲false 最終肯定是false
false
---------------------------------------------------------------------
(3>2) || (3>4)
true || 或兩個條件有一個滿足 如果當第一個條件爲true 最終結果爲true
true
&&短路與
1.短路 什麼情況下才會發生短路? 當前面的值結果爲false的時候會發生短路
2.短路 到底短路的是什麼? 短路的是&&之後所有計算的過程
3.如果發生了短路情況 性能比 & 稍微好一點
4.&邏輯與 和 &&短路與 從執行的最終結果看了沒有任何區別
5.短路與 不一定提高了性能 只有當前面的爲false的時候纔會發生短路 纔會提高性能
邏輯運算符前後連接的應該是兩個boolen結果
&邏輯與 可以理解爲中文的“和”,"並且"的意思,&前後兩個條件必須同時滿足 最終才爲true
|邏輯或 可以理解爲中文的“或者” |前後兩個條件只要有一個滿足 最終就爲true
^邏輯異或 前後兩個表達式只要結果不相同 最終結果就爲true(專治強迫症)
!邏輯非 可以理解爲中文的"不" 將原來的結果取反
知識補充 進制轉換
十進制 0123456789
二進制 01
如何將十進制---->二進制
60十進制 ---->32個2或1來表示60 60除以2取餘數 將餘數倒敘排列 即爲有效位
00000000 00000000 0000000 00111100
如何將二進制—>十進制 從右至左開始計算 每一個元素乘以2的位置(0開始)次冪最終求和
===================================================================
每三個bit記錄爲一個小組 —>小組長的名字 (3個bit計算成十進制)
00000000 000000 000 000 000 000 111 100
0 7 4
八進制 012345667
將三個二進制合併爲一個 計算成十進制表示 八進制表示形式以0開頭
074
===================================================================
每四個bit記錄爲一個小組 —>小組長的名字 (4個bit計算成十進制)
00000000 00000000 0000 0000 0011 1100
0X 3 12 10-A 11-B 12-C 13-D 14-E 15-F
十六進制 012345667189ABCDEF
將三個二進制合併爲一個 計算成十進制表示 八進制表示形式以0開頭
0X3C
位(bit)運算
&按位與 |按位或 ^按位異或 ~按位取反
<<按位左位移 >>按位右位移 >>>按位右位移(無符號)
1.將3和5轉化爲二進制表示形式
2.豎着按照對應位置進行 & | ^ 計算(1--->true,0--->false)
3.將計算後的二進制結果轉化爲十進制
3 & 5 =?
00000011
00000101
00000001----->1
3 | 5 =? 或
00000011
00000101
00000111------>7
3 ^ 5 =? 異或
00000011
00000101
00000110------>6
~6=?
知識補充
原碼 反碼 補碼 二進制表示數字
6
原碼: 00000000 00000000 00000000 00000110
反碼: 00000000 00000000 00000000 00000110
補碼: 00000000 00000000 00000000 00000110
負數 -6
原碼: 10000000 00000000 00000000 00000110 將正數的符號改爲負
反碼: 11111111 11111111 11111111 11111001 符號不動 其餘取反
補碼: 11111111 11111111 11111111 11111010 在負數的反碼上+1
進算機中不管是整數還是負數 存儲的形式都是以補碼的形式來存儲
注意 反碼是一中表現形式 取反是一個計算過程(每一個位置都取反)
~6 6取反
00000000 00000000 00000000 00000110 1.6的二進制
11111111 11111111 11111111 11111001 2.取反得到二進制數 是負數 的補碼
將二進制轉爲十進制
11111111 11111111 11111111 11111000 3.將負數的bu碼-1改 反碼
10000000 00000000 00000000 00000111 4.符號不動 其餘取反得到原碼
00000000 00000000 00000000 00000111 5.將負數的原碼轉爲正數原碼
1+2+4=7 取反-7 6.將原碼計算出十進制值爲7 最後值爲-7
6<<1 = 12 6乘以2的1次冪 6*(2*1)=12
00000000 00000000 00000000 00000110
00000000 00000000 00000000 00001100 8+8 = 12
6<<2 = 24 6乘以2的2次冪 6*(2*2)=24
00000000 00000000 00000000 00000110
00000000 00000000 00000000 00011000 16+8 = 24
相當與乘以2的位移次冪
6>>1=3 6除以2的次冪 6/(2*1)=3
00000000 00000000 00000000 00000110
00000000 00000000 00000000 00000011 2+1=3
相當與除以2的位移次冪
-6>>1 = 3
11111111 11111111 11111111 11111010
?1111111 11111111 11111111 11111101
11111111 11111111 11111111 11111101 1.保留符號位置 1 填1 得到補碼
11111111 11111111 11111111 11111100 2.-1得到補碼
10000000 00000000 00000000 00000011 3.符號不變 其餘取反 得到原碼
00000000 00000000 00000000 00000011 4.得到正數
2+1 5.計算得3
>>保留符號位置 1 填1
>>>不保留符號 不管是什麼 都填0
-6>>>1 =
11111111 11111111 11111111 11111010
?1111111 11111111 11111111 11111101
01111111 11111111 11111111 11111101 1.不保留符號 不管是什麼 都填0
1*2 ^0 1
0*(2^1=2) 0 1
1*2^2 4 5
1 ^3 8 13
^4 16 29
^5 32 61
^6 64 125
7 128 253
8 256 509
9 512 1021
10 1024 2045
11 2048 4463
12 4096
13 8192
14 16384
15 32768
16 65536
17 131072
18 262144
19 524288
20 1048576
21 2097152
22 4194304
23 8388608
24 16777216
25 33554432
26 67108864
27 134217728
28 268435456
29 536870912
30 1073741824
0 *2^31 2147483648