Java中的位運算符全解
1. &(按位與運算符)
&按位與的運算規(guī)則是將兩邊的數(shù)轉(zhuǎn)換為二進制位,然后運算最終值,運算規(guī)則即(兩個為真才為真):1&1=1 , 1&0=0 , 0&1=0 , 0&0=0
public class Main {
public static void main(String[] args) {
// &按位與,運算符兩邊的條件值會先轉(zhuǎn)換為2進制,然后再比對運算
/**
* 0 0 1 1
* 0 1 0 1
* -----------
* 0 0 0 1
*/
int a = 3&5;
/**
* 0 0 0 1
* 0 0 1 0
* -----------
* 0 0 0 0
*/
int b = 1&2;
System.out.println(a);// 1
System.out.println(b);// 0
}
}
2. |(按位或運算符)
|按位或和&按位與計算方式都是轉(zhuǎn)換二進制再計算,不同的是運算規(guī)則(一個為真即為真):1|0 = 1 , 1|1 = 1 , 0|0 = 0 , 0|1 = 1
public class Main {
public static void main(String[] args) {
// |按位或,運算符兩邊的條件值會先轉(zhuǎn)換為2進制,然后再比對運算
/**
* 0 0 1 1
* 0 1 0 1
* -------------
* 0 1 1 1
*/
int a = 3|5;
/**
* 0 0 0 1
* 0 0 1 0
* -------------
* 0 0 1 1
*/
int b = 1|2;
System.out.println(a);// 7
System.out.println(b);// 3
}
}
3. ^(異或運算符)
^異或運算符顧名思義,異就是不同,其運算規(guī)則為1^0 = 1 , 1^1 = 0 , 0^1 = 1 , 0^0 = 0
public class Main {
public static void main(String[] args) {
/**
* 0 0 1 1
* 0 1 0 1
* -------------
* 0 1 1 0
*/
int a = 3^5;
/**
* 0 0 0 1
* 0 0 1 0
* -------------
* 0 0 1 1
*/
int b = 1^2;
System.out.println(a);// 6
System.out.println(b);// 3
}
}
4. <<(左移運算符)
5<<2的意思為5的二進制位往左挪兩位,右邊補0
5的二進制位是0000 0101 , 就是把有效值101往左挪兩位就是0001 0100 ,正數(shù)左邊第一位補0,負數(shù)補1,等于乘于2的n次方,十進制位是5*2^2=20
public class Main {
public static void main(String[] args) {
/**
* 5<<2的意思為5的二進制位往左挪兩位,右邊補0
* 0 0 0 0 0 1 0 1
* 0 0 0 1 0 1 0 0
*/
System.out.println(5<<2); // 20
}
}
5. >> (右移移運算符)
凡位運算符都是把值先轉(zhuǎn)換成二進制再進行后續(xù)的處理
5的二進制位是0000 0101,右移兩位就是把101左移后為0000 0001,正數(shù)左邊第一位補0,負數(shù)補1,等于除于2的n次方,結果為1
public class Main {
public static void main(String[] args) {
/**
* 5>>2的意思為5的二進制位往右挪兩位,左邊補0
* 0 0 0 0 0 1 0 1
* 0 0 0 0 0 0 0 1
*/
System.out.println(5<<2); // 1
}
}
6. ~(取反運算符)
取反就是1為0,0為1
5的二進制位是0000 0101,取反后為1111 1010,值為-6
public class Main {
public static void main(String[] args) {
/**
* 0 0 0 0 0 1 0 1
* ---------------------
* 1 1 1 1 1 0 1 0
*
* 1、如果 11111010 想轉(zhuǎn)為負的十進制,因為最高位是1,所以先將11111001減1得到11111001
* 2、取反 00010101,然后計算出 00000100 對應的十進制為6
* 3、所以 11111010 最終對應的十進制為 -6
*
* 1 1 1 1 1 0 1 0
* - 0 0 0 0 0 0 0 1
* ---------------------
* 1 1 1 1 1 0 0 1
* ---------------------
* 0 0 0 0 0 1 0 0
*/
System.out.println(~5); // -6
}
}
7. >>>(無符號右移運算符)
(1) 正數(shù)無符號右移
無符號右移運算符和右移運算符的主要區(qū)別在于負數(shù)的計算,因為無符號右移是高位補0,移多少位補多少個0。
15的二進制位是0000 1111 , 右移2位0000 0011,結果為3
public class Main {
public static void main(String[] args) {
/**
* 0000 1111
* ---------------
* 0000 0011
*/
System.out.println(15>>>2); // 3
}
}
(2) 負數(shù)無符號右移
-6的二進制是6的二進制取反再加1,6的二進制也就是0000 0000 0000 0000 0000 0000 0000 0110,取反后加1為1111 1111 1111 1111 1111 1111 1111 1010,右移三位0001 1111 1111 1111 1111 1111 1111 1111
public class Main {
public static void main(String[] args) {
System.out.println(-6>>>3); // 536870911
}
}
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!
相關文章
如何用ObjectMapper將復雜Map轉(zhuǎn)換為實體類
這篇文章主要介紹了如何用ObjectMapper將復雜Map轉(zhuǎn)換為實體類的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
ShardingSphere jdbc實現(xiàn)分庫分表核心概念詳解
這篇文章主要為大家介紹了ShardingSphere jdbc實現(xiàn)分庫分表核心概念詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
兩萬字詳解Java Sring String的常見操作以及StringBuffer StringBuilder的區(qū)別
本篇文章帶你認識Sring、String的常見操作和StringBuffer 與StringBuilder的區(qū)別(字符串詳解),對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09
Java?Spring?boot日期和時間統(tǒng)一設置三種方法
時間和日期的統(tǒng)一設置在項目中經(jīng)常是會遇到的,下面這篇文章主要給大家介紹了關于Java?Spring?boot日期和時間統(tǒng)一設置的三種方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-08-08
Springboot之@Controller注解不生效問題及解決
這篇文章主要介紹了Springboot之@Controller注解不生效問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10

