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