java運算符:
定義:用來指明對於操作數的運算方式
按照操作數數目分類:
單目運算 數目運算 三目運算
a++ a+b (a>b) ? x:y
按照運算符功能分類:
算術運算符:
+ - * / %(取余/取模)
++ 自增
-- 自減
注:int x = 1; int y = x++ 將x變量空間的內容先取出,然后將常量區的1取出x在像做
值交換的時候會產生一個臨時的副本空間,++(--)在變量前面則先自增后備份,++(--)在
變量后面則先備份后自增,=號是將備份空間中的值賦值給別人
例:
int m =1;
int n =2;
int sum = m++ + ++n - n-- - --m + n-- - --m ;
System.out.println("m="+m+", n="+n+", sum="+sum);
m =0 n =1 sum = 2
賦值運算符:
= 賦值號
+= int x=1 x+=10 ; 相當於 x = x+10 // 11
-= int x=10 x-=10 ; 相當於 x = x-10 // 0
*= int x=10 x*=10 ; 相當於 x = x*10 // 100
/= int x=10 x-=10 ; 相當於 x = x/10 // 1
%= int x=10 x%=10 ; 相當於 x = x%10 // 0
注:
byte a = 1;
a +=1; //2
a = a+1;//編譯報錯
a = (byte)(a+2) // 強制轉換,通過
講解:計算機中+=相當於一個運算符,會先用+符號自動的將byte提升為32bit的int類型
來進行計算,然后在通過=運算符將32bit位的int類型自動降為8bit的數據來存入a
中,但是a=a+1中的=和+屬於兩個運算符,+將byte中的1提升為32bit來個常量池
中的1進行相加,但是=賦值時在將32bit位的數據賦值到8bit位中的a空間中,會出
現編譯報錯
總結:
單個運算符后台編譯可以自動提升或者降低bit位來滿足賦值或者計算,但是賦值
號之后不能自動降級方程式,需要強制轉換
位運算符:
&按位與 | 按位或 ^ 按位異或 ~ 按位取反
<<按位左位移 >>按位右位移 >>>按位又位移(無符號)
例: 3 & 5 = ? 3 | 5 = ? 3 ^ 5 = ? ~ 6 = ?
解: 將3 和 5分別換算成二進制
3 = 00000000 00000000 00000000 00000011 = 011
5 = 00000000 00000000 00000000 00000101 = 101
所以按位&即將011和101進行按位&后在化成10進制(true 為 1 false 為 0)
0 1 1
1 0 1
0 0 1 = 1
所以按位 | 即將011和101進行按位 | 后在化成10進制(true 為 1 false 為 0)
0 1 1
1 0 1
1 1 1 = 7
所以按位 ^ 即將011和101進行按位^后在化成10進制(true 為 1 false 為 0)
0 1 1
1 0 1
1 1 0 = 6
所以按位 即將101進行按位 ~ 后在化成10進制(true 為 1 false 為 0)
~6 = -7
解釋:計算機將0划分在正數行列,所以 -1<-->0 -2 <--->1 -3<--->2 故 -7<-->6
6 (正數三碼相同)
00000000 00000000 00000000 0110 (原碼)
00000000 00000000 00000000 0110 (反碼)
00000000 00000000 00000000 0110 (補碼)
-6 (負數三碼不同)
10000000 00000000 00000000 00000110 (原碼)
11111111 11111111 11111111 11111001 (反碼:保持符號不動其余取反)
11111111 11111111 11111111 11111010 (補碼:在反碼基礎上+1)
計算機中不管是整數還是負數,存儲的形式都是以補碼形式來存儲
注:反碼是一種表示形式 取反是一個計算過程
<<按位左位移:
6<<1=?
00000110 = 00001100 = 12
所以往左移相當於*2的位移次冪
6>>1=?
00000110 = 00000011 = 3
所以往左移相當於/2的位移次冪
負數
-6 >>>1
11111111 11111111 11111111 11111010(以補碼計算)
?1111111 11111111 11111111 11111101
注: >> 保留符號位1填1
>>> 不保留符號 不管是什么都填0