位運算符主要針對二進制,它包括了:「與」、「非」、「或」、「異或」。從表面上看彷佛有點像邏輯運算符,但邏輯運算符是針對兩個關係運算符來進行邏輯運算,而位運算符主要針對兩個二進制數的位進行邏輯運算。下面詳細介紹每一個位運算符。java
1.與運算符
與運算符用符號「&」表示,其使用規律以下:
兩個操做數中位都爲1,結果才爲1,不然結果爲0,例以下面的程序段。
程序員
public class data13{ public static void main(String[] args){ int a=129; int b=128; System.out.println("a 和b 與的結果是:"+(a&b)); } } 運行結果 a 和b 與的結果是:128 下面分析這個程序: 「a」的值是129,轉換成二進制就是10000001,而「b」的值是128,轉換成二進制就是10000000。根據與運算符的運算規律,只有兩個位都是1,結果纔是1,能夠知道結果就是10000000,即128。
2.或運算符
或運算符用符號「|」表示,其運算規律以下:
兩個位只要有一個爲1,那麼結果就是1,不然就爲0,下面看一個簡單的例子。
編程
public class data14{ public static void main(String[] args){ int a=129; int b=128; System.out.println("a 和b 或的結果是:"+(a|b)); } } 運行結果 a 和b 或的結果是:129 下面分析這個程序段: a 的值是129,轉換成二進制就是10000001,而b 的值是128,轉換成二進制就是10000000,根據或運算符的運算規律,只有兩個位有一個是1,結果纔是1,能夠知道結果就是10000001,即129。
3.非運算符
非運算符用符號「~」表示,其運算規律以下:安全
若是位爲0,結果是1,若是位爲1,結果是0,下面看一個簡單例子。
編程語言
public class data15{ public static void main(String[] args){ int a=2; System.out.println("a 非的結果是:"+(~a)); } }
4.異或運算符
異或運算符是用符號「^」表示的,其運算規律是:
兩個操做數的位中,相同則結果爲0,不一樣則結果爲1。下面看一個簡單的例子。
ide
public class data16{ public static void main(String[] args){ int a=15; int b=2; System.out.println("a 與 b 異或的結果是:"+(a^b)); } } 運行結果 a 與 b 異或的結果是:13 分析上面的程序段:a 的值是15,轉換成二進制爲1111,而b 的值是2,轉換成二進制爲0010,根據異或的運算規律,能夠得出其結果爲1101 即13。
Java中的運算符(操做符)spa
程序的基本功能是處理數據,任何編程語言都有本身的運算符。由於有了運算符,程序員才寫出表達式,實現各類運算操做,實現各類邏輯要求。.net
爲實現邏輯和運算要求,編程語言設置了各類不一樣的運算符,且有優先級順序,因此有的初學者使用複雜表達式的時候搞不清楚。這裏詳細介紹一下Java中的運算符。對象
Java運算符不少,下面按優先順序列出了各類運算符。blog
優先級 | 運算符分類 | 結合順序 | 運算符 |
由 高 到 低 |
分隔符 | 左結合 | . [] ( ) ; , |
一元運算符 | 右結合 | ! ++ -- - ~ | |
算術運算符 移位運算符 |
左結合 | * / % + - << >> >>> | |
關係運算符 | 左結合 | < > <= >= instanceof(Java 特有) = = != | |
邏輯運算符 | 左結合 | ! && || ~ & | ^ | |
三目運算符 | 右結合 | 布爾表達式?表達式1:表達式2 | |
賦值運算符 | 右結合 | = *= /= %= += -= <<= >>= >>>= &= *= |= |
1、一元運算符
因操做數是一個,故稱爲一元運算符。
運算符 | 含義 | 例子 |
- | 改變數值的符號,取反 | -x(-1*x) |
~ | 逐位取反,屬於位運算符 | ~x |
++ | 自加1 | x++ |
-- | 自減1 | x-- |
++x 由於++在前,因此先加後用。
x++ 由於++在後,因此先用後加。
注意:a+ ++b和a+++b是不同的(由於有一個空格)。
int a=10;
int b=10;
int sum=a+ ++b;
System.out.println("a="+a+",b="+b+",sum="+sum);
運行結果是: a=10,b=11,sum=21
int a=10;
int b=10;
int sum=a+++b;
System.out.println("a="+a+",b="+b+",sum="+sum);
運行結果是:a=11,b=10,sum=20
n=10;
m=~n;
變量n的二進制數形式: 00000000 00000000 00000000 00001010
逐位取反後,等於十進制的-11: 11111111 11111111 11111111 11110101
2、算術運算符
所謂算術運算符,就是數學中的加、減、乘、除等運算。因算術運算符是運算兩個操做符,故又稱爲二元運算符。
運算符 | 含義 | 例子 |
+ | 加法運算 | x+y |
- | 減法運算 | x-y |
* | 乘法運算 | x*y |
/ | 除法運算 | x/y |
% | 取模運算(求餘運算) | x%y |
這些操做能夠對不一樣類型的數字進行混合運算,爲了保證操做的精度,系統在運算過程當中會作相應的轉化。數字精度的問題,咱們在這裏再也不討論。下圖中展現了運算過程當中,數據自動向上造型的原則。
注:一、實線箭頭表示沒有信息丟失的轉換,也就是安全性的轉換,虛線的箭頭表示有精度損失的轉化,也就是不安全的。
二、當兩個操做數類型不相同時,操做數在運算前會子鬆向上造型成相同的類型,再進行運算。
示例以下:
[java] view plaincopy
int a=22;
int b=5;
double c=5;
System.out.println(b+"+"+c+"="+(b+c));
System.out.println(b+"-"+c+"="+(b-c));
System.out.println(b+"*"+c+"="+(b*c));
System.out.println(a+"/"+b+"="+(a/b));
System.out.println(a+"%"+b+"="+(a%b));
System.out.println(a+"/"+c+"="+(a/c));
System.out.println(a+"%"+c+"="+(a%c));
運行結果以下:
5+5.0=10.0
5-5.0=0.0
5*5.0=25.0
22/5=4
22%5=2
22/5.0=4.4
22%5.0=2.0
3、移位運算符
移位運算符操做的對象就是二進制的位,能夠單獨用移位運算符來處理int型整數。
運算符 | 含義 | 例子 |
<< | 左移運算符,將運算符左邊的對象向左移動運算符右邊指定的位數(在低位補0) | x<<3 |
>> | "有符號"右移運算 符,將運算符左邊的對象向右移動運算符右邊指定的位數。使用符號擴展機制,也就是說,若是值爲正,則在高位補0,若是值爲負,則在高位補1. | x>>3 |
>>> | "無符號"右移運算 符,將運算符左邊的對象向右移動運算符右邊指定的位數。採用0擴展機制,也就是說,不管值的正負,都在高位補0. | x>>>3 |
以int類型的6297爲例,代碼以下:
[java] view plaincopy
System.out.println(Integer.toBinaryString(6297));
System.out.println(Integer.toBinaryString(-6297));
System.out.println(Integer.toBinaryString(6297>>5));
System.out.println(Integer.toBinaryString(-6297>>5));
System.out.println(Integer.toBinaryString(6297>>>5));
System.out.println(Integer.toBinaryString(-6297>>>5));
System.out.println(Integer.toBinaryString(6297<<5));
System.out.println(Integer.toBinaryString(-6297<<5));
運行結果:
1100010011001
11111111111111111110011101100111
11000100
11111111111111111111111100111011
11000100
111111111111111111100111011
110001001100100000
11111111111111001110110011100000
注:x<<y 至關於 x*2y ;x>>y至關於x/2y
從計算速度上講,移位運算要比算術運算快。
若是x是負數,那麼x>>>3沒有什麼算術意義,只有邏輯意義。
4、關係運算符
Java具備完備的關係運算符,這些關係運算符同數學中的關係運算符是一致的。具體說明以下:
運算符 | 含義 | 例子 |
< | 小於 | x<y |
> | 大於 | x>y |
<= | 小於等於 | x<=y |
>= | 大於等於 | x>=y |
== | 等於 | x==y |
!= | 不等於 | x!=y |
instanceof操做符用於判斷一個引用類型所引用的對象是不是一個類的實例。操做符左邊的操做元是一個引用類型,右邊的操做元是一個類名或者接口,形式以下:
obj instanceof ClassName 或者 obj instanceof InterfaceName
關係運算符產生的結果都是布爾型的值,通常狀況下,在邏輯與控制中會常用關係運算符,用於選擇控制的分支,實現邏輯要求。
須要注意的是:關係運算符中的"=="和"!="既能夠操做基本數據類型,也能夠操做引用數據類型。操做引用數據類型時,比較的是引用的內存地址。因此在比較非基本數據類型時,應該使用equals方法。
5、邏輯運算符
A | !A |
true | false |
false |
true |
A | B | A&&B |
false | false | false |
true | false | false |
false | true | false |
true | true | true |
A | B | A||B |
false | false | false |
true | false | true |
false | true | true |
true | true | true |
在運用邏輯運算符進行相關的操做,就不得不說「短路」現象。代碼以下:
if(1==1 && 1==2 && 1==3){ }
代碼從左至右執行,執行第一個邏輯表達式後:true && 1==2 && 1==3
執行第二個邏輯表達式後:true && false && 1==3
由於其中有一個表達式的值是false,能夠斷定整個表達式的值是false,就沒有必要執行第三個表達式了,因此java虛擬機不執行1==3代碼,就好像被短路掉了。
邏輯或也存在「短路」現象,當執行到有一個表達式的值爲true時,整個表達式的值就爲true,後面的代碼就不執行了。
「短路」現象在多重判斷和邏輯處理中很是有用。咱們常常這樣使用:
[java] view plaincopy
public void a(String str){
if(str!=null && str.trim().length()>0){
}
}
若是str爲null,那麼執行str.trim().length()就會報錯,短路現象保證了咱們的代碼可以正確執行。
在書寫布爾表達式時,首先處理主要條件,若是主要條件已經不知足,其餘條件也就失去了處理的意義。也提升了代碼的執行效率。
位運算是對整數的二進制位進行相關操做,詳細運算以下:
A | ~A |
1 | 0 |
0 |
1 |
A | B | A&B |
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
A | B | A | B |
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
A | B | A&B |
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
示例以下:
[java] view plaincopy
int a=15;
int b=2;
System.out.println(a+"&"+b+"="+(a&b));
System.out.println(a+"|"+b+"="+(a|b));
System.out.println(a+"^"+b+"="+(a^b));
運算結果以下:
15&2=2
15|2=15
15^2=13
程序分析:
a | 1 | 1 | 1 | 1 | 15 |
b | 0 | 0 | 1 | 0 | 2 |
a&b | 0 | 0 | 1 | 0 | 2 |
a|b | 1 | 1 | 1 | 1 | 15 |
a^b | 1 | 1 | 0 | 1 | 13 |
按位運算屬於計算機低級的運算,如今咱們也不頻繁的進行這樣的低級運算了。
6、三目運算符
三目運算符是一個特殊的運算符,它的語法形式以下:
布爾表達式?表達式1:表達式2
運算過程:若是布爾表達式的值爲true,就返回表達式1的值,不然返回表達式2的值,例如:
int sum=90;
String str=sum<100 ? "失敗" : "成功";
等價於下列代碼:
String str=null;
if(num<100){
str="失敗";
}else{
str="成功";
}
三目運算符和if……else語句相比,前者使程序代碼更加簡潔。
7、賦值運算符
賦值運算符是程序中最經常使用的運算符了,示例以下:
運算符 | 例子 | 含義 |
+= | x+=y | x=x+y |
-= | x-=y | x=x-y |
*= | x*=y | x=x*y |
/= | x/=y | x=x/y |
%= | x%=y | x=x%y |
>>= | x>>=y | x=x>>y |
>>>= | a>>>=y | x=x>>>y |
<<= | a<<=y | x=x<<y |
&= | x&=y | x=x&y |
|= | x|=y | x=x|y |
^= | x^=y | x=x^y |
你們能夠根據本身的喜愛選擇合適的運算符。
補充:
字符串運算符: + 能夠鏈接不一樣的字符串。
轉型運算符: () 能夠將一種類型的數據或對象,強制轉變成另外一種類型。若是類型不相容,會報異常出來。
位運算符主要針對二進制,它包括了:「與」、「非」、「或」、「異或」。從表面上看彷佛有點像邏輯運算符,但邏輯運算符是針對兩個關係運算符來進行邏輯運算,而位運算符主要針對兩個二進制數的位進行邏輯運算。下面詳細介紹每一個位運算符。
1.與運算符
與運算符用符號「&」表示,其使用規律以下:
兩個操做數中位都爲1,結果才爲1,不然結果爲0,例以下面的程序段。
public class data13
{
public static void main(String[] args)
{
int a=129;
int b=128;
System.out.println("a 和b 與的結果是:"+(a&b));
}
}
運行結果
a 和b 與的結果是:128
下面分析這個程序:
「a」的值是129,轉換成二進制就是10000001,而「b」的值是128,轉換成二進制就是10000000。根據與運算符的運算規律,只有兩個位都是1,結果纔是1,能夠知道結果就是10000000,即128。
2.或運算符
或運算符用符號「|」表示,其運算規律以下:
兩個位只要有一個爲1,那麼結果就是1,不然就爲0,下面看一個簡單的例子。
public class data14
{
public static void main(String[] args)
{
int a=129;
int b=128;
System.out.println("a 和b 或的結果是:"+(a|b));
}
}
運行結果
a 和b 或的結果是:129
下面分析這個程序段:
a 的值是129,轉換成二進制就是10000001,而b 的值是128,轉換成二進制就是10000000,根據或運算符的運算規律,只有兩個位有一個是1,結果纔是1,能夠知道結果就是10000001,即129。
3.非運算符
非運算符用符號「~」表示,其運算規律以下:
若是位爲0,結果是1,若是位爲1,結果是0,下面看一個簡單例子。
public class data15
{
public static void main(String[] args)
{
int a=2;
System.out.println("a 非的結果是:"+(~a));
}
}
4.異或運算符
異或運算符是用符號「^」表示的,其運算規律是:
兩個操做數的位中,相同則結果爲0,不一樣則結果爲1。下面看一個簡單的例子。
public class data16
{
public static void main(String[] args)
{
int a=15;
int b=2;
System.out.println("a 與 b 異或的結果是:"+(a^b));
}
}
運行結果
a 與 b 異或的結果是:13
分析上面的程序段:a 的值是15,轉換成二進制爲1111,而b 的值是2,轉換成二進制爲0010,根據異或的運算規律,能夠得出其結果爲1101 即13。
Java中的運算符(操做符)
程序的基本功能是處理數據,任何編程語言都有本身的運算符。由於有了運算符,程序員才寫出表達式,實現各類運算操做,實現各類邏輯要求。
爲實現邏輯和運算要求,編程語言設置了各類不一樣的運算符,且有優先級順序,因此有的初學者使用複雜表達式的時候搞不清楚。這裏詳細介紹一下Java中的運算符。
Java運算符不少,下面按優先順序列出了各類運算符。
優先級 | 運算符分類 | 結合順序 | 運算符 |
由 高 到 低 |
分隔符 | 左結合 | . [] ( ) ; , |
一元運算符 | 右結合 | ! ++ -- - ~ | |
算術運算符 移位運算符 |
左結合 | * / % + - << >> >>> | |
關係運算符 | 左結合 | < > <= >= instanceof(Java 特有) = = != | |
邏輯運算符 | 左結合 | ! && || ~ & | ^ | |
三目運算符 | 右結合 | 布爾表達式?表達式1:表達式2 | |
賦值運算符 | 右結合 | = *= /= %= += -= <<= >>= >>>= &= *= |= |
1、一元運算符
因操做數是一個,故稱爲一元運算符。
運算符 | 含義 | 例子 |
- | 改變數值的符號,取反 | -x(-1*x) |
~ | 逐位取反,屬於位運算符 | ~x |
++ | 自加1 | x++ |
-- | 自減1 | x-- |
++x 由於++在前,因此先加後用。
x++ 由於++在後,因此先用後加。
注意:a+ ++b和a+++b是不同的(由於有一個空格)。
int a=10;
int b=10;
int sum=a+ ++b;
System.out.println("a="+a+",b="+b+",sum="+sum);
運行結果是: a=10,b=11,sum=21
int a=10;
int b=10;
int sum=a+++b;
System.out.println("a="+a+",b="+b+",sum="+sum);
運行結果是:a=11,b=10,sum=20
n=10;
m=~n;
變量n的二進制數形式: 00000000 00000000 00000000 00001010
逐位取反後,等於十進制的-11: 11111111 11111111 11111111 11110101
2、算術運算符
所謂算術運算符,就是數學中的加、減、乘、除等運算。因算術運算符是運算兩個操做符,故又稱爲二元運算符。
運算符 | 含義 | 例子 |
+ | 加法運算 | x+y |
- | 減法運算 | x-y |
* | 乘法運算 | x*y |
/ | 除法運算 | x/y |
% | 取模運算(求餘運算) | x%y |
這些操做能夠對不一樣類型的數字進行混合運算,爲了保證操做的精度,系統在運算過程當中會作相應的轉化。數字精度的問題,咱們在這裏再也不討論。下圖中展現了運算過程當中,數據自動向上造型的原則。
注:一、實線箭頭表示沒有信息丟失的轉換,也就是安全性的轉換,虛線的箭頭表示有精度損失的轉化,也就是不安全的。
二、當兩個操做數類型不相同時,操做數在運算前會子鬆向上造型成相同的類型,再進行運算。
示例以下:
[java] view plaincopy
int a=22;
int b=5;
double c=5;
System.out.println(b+"+"+c+"="+(b+c));
System.out.println(b+"-"+c+"="+(b-c));
System.out.println(b+"*"+c+"="+(b*c));
System.out.println(a+"/"+b+"="+(a/b));
System.out.println(a+"%"+b+"="+(a%b));
System.out.println(a+"/"+c+"="+(a/c));
System.out.println(a+"%"+c+"="+(a%c));
運行結果以下:
5+5.0=10.0
5-5.0=0.0
5*5.0=25.0
22/5=4
22%5=2
22/5.0=4.4
22%5.0=2.0
3、移位運算符
移位運算符操做的對象就是二進制的位,能夠單獨用移位運算符來處理int型整數。
運算符 | 含義 | 例子 |
<< | 左移運算符,將運算符左邊的對象向左移動運算符右邊指定的位數(在低位補0) | x<<3 |
>> | "有符號"右移運算 符,將運算符左邊的對象向右移動運算符右邊指定的位數。使用符號擴展機制,也就是說,若是值爲正,則在高位補0,若是值爲負,則在高位補1. | x>>3 |
>>> | "無符號"右移運算 符,將運算符左邊的對象向右移動運算符右邊指定的位數。採用0擴展機制,也就是說,不管值的正負,都在高位補0. | x>>>3 |
以int類型的6297爲例,代碼以下:
[java] view plaincopy
System.out.println(Integer.toBinaryString(6297));
System.out.println(Integer.toBinaryString(-6297));
System.out.println(Integer.toBinaryString(6297>>5));
System.out.println(Integer.toBinaryString(-6297>>5));
System.out.println(Integer.toBinaryString(6297>>>5));
System.out.println(Integer.toBinaryString(-6297>>>5));
System.out.println(Integer.toBinaryString(6297<<5));
System.out.println(Integer.toBinaryString(-6297<<5));
運行結果:
1100010011001
11111111111111111110011101100111
11000100
11111111111111111111111100111011
11000100
111111111111111111100111011
110001001100100000
11111111111111001110110011100000
注:x<<y 至關於 x*2y ;x>>y至關於x/2y
從計算速度上講,移位運算要比算術運算快。
若是x是負數,那麼x>>>3沒有什麼算術意義,只有邏輯意義。
4、關係運算符
Java具備完備的關係運算符,這些關係運算符同數學中的關係運算符是一致的。具體說明以下:
運算符 | 含義 | 例子 |
< | 小於 | x<y |
> | 大於 | x>y |
<= | 小於等於 | x<=y |
>= | 大於等於 | x>=y |
== | 等於 | x==y |
!= | 不等於 | x!=y |
instanceof操做符用於判斷一個引用類型所引用的對象是不是一個類的實例。操做符左邊的操做元是一個引用類型,右邊的操做元是一個類名或者接口,形式以下:
obj instanceof ClassName 或者 obj instanceof InterfaceName
關係運算符產生的結果都是布爾型的值,通常狀況下,在邏輯與控制中會常用關係運算符,用於選擇控制的分支,實現邏輯要求。
須要注意的是:關係運算符中的"=="和"!="既能夠操做基本數據類型,也能夠操做引用數據類型。操做引用數據類型時,比較的是引用的內存地址。因此在比較非基本數據類型時,應該使用equals方法。
5、邏輯運算符
A | !A |
true | false |
false |
true |
A | B | A&&B |
false | false | false |
true | false | false |
false | true | false |
true | true | true |
A | B | A||B |
false | false | false |
true | false | true |
false | true | true |
true | true | true |
在運用邏輯運算符進行相關的操做,就不得不說「短路」現象。代碼以下:
if(1==1 && 1==2 && 1==3){ }
代碼從左至右執行,執行第一個邏輯表達式後:true && 1==2 && 1==3
執行第二個邏輯表達式後:true && false && 1==3
由於其中有一個表達式的值是false,能夠斷定整個表達式的值是false,就沒有必要執行第三個表達式了,因此java虛擬機不執行1==3代碼,就好像被短路掉了。
邏輯或也存在「短路」現象,當執行到有一個表達式的值爲true時,整個表達式的值就爲true,後面的代碼就不執行了。
「短路」現象在多重判斷和邏輯處理中很是有用。咱們常常這樣使用:
[java] view plaincopy
public void a(String str){
if(str!=null && str.trim().length()>0){
}
}
若是str爲null,那麼執行str.trim().length()就會報錯,短路現象保證了咱們的代碼可以正確執行。
在書寫布爾表達式時,首先處理主要條件,若是主要條件已經不知足,其餘條件也就失去了處理的意義。也提升了代碼的執行效率。
位運算是對整數的二進制位進行相關操做,詳細運算以下:
A | ~A |
1 | 0 |
0 |
1 |
A | B | A&B |
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
A | B | A | B |
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
A | B | A&B |
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
示例以下:
[java] view plaincopy
int a=15;
int b=2;
System.out.println(a+"&"+b+"="+(a&b));
System.out.println(a+"|"+b+"="+(a|b));
System.out.println(a+"^"+b+"="+(a^b));
運算結果以下:
15&2=2
15|2=15
15^2=13
程序分析:
a | 1 | 1 | 1 | 1 | 15 |
b | 0 | 0 | 1 | 0 | 2 |
a&b | 0 | 0 | 1 | 0 | 2 |
a|b | 1 | 1 | 1 | 1 | 15 |
a^b | 1 | 1 | 0 | 1 | 13 |
按位運算屬於計算機低級的運算,如今咱們也不頻繁的進行這樣的低級運算了。
6、三目運算符
三目運算符是一個特殊的運算符,它的語法形式以下:
布爾表達式?表達式1:表達式2
運算過程:若是布爾表達式的值爲true,就返回表達式1的值,不然返回表達式2的值,例如:
int sum=90;
String str=sum<100 ? "失敗" : "成功";
等價於下列代碼:
String str=null;
if(num<100){
str="失敗";
}else{
str="成功";
}
三目運算符和if……else語句相比,前者使程序代碼更加簡潔。
7、賦值運算符
賦值運算符是程序中最經常使用的運算符了,示例以下:
運算符 | 例子 | 含義 |
+= | x+=y | x=x+y |
-= | x-=y | x=x-y |
*= | x*=y | x=x*y |
/= | x/=y | x=x/y |
%= | x%=y | x=x%y |
>>= | x>>=y | x=x>>y |
>>>= | a>>>=y | x=x>>>y |
<<= | a<<=y | x=x<<y |
&= | x&=y | x=x&y |
|= | x|=y | x=x|y |
^= | x^=y | x=x^y |
你們能夠根據本身的喜愛選擇合適的運算符。
補充:
字符串運算符: + 能夠鏈接不一樣的字符串。
轉型運算符: () 能夠將一種類型的數據或對象,強制轉變成另外一種類型。若是類型不相容,會報異常出來。