Java中的位運算符全解
1. &(按位與運算符)
&
按位與的運算規(guī)則是將兩邊的數(shù)轉換為二進制位,然后運算最終值,運算規(guī)則即(兩個為真才為真):1&1=1 , 1&0=0 , 0&1=0 , 0&0=0
public class Main { public static void main(String[] args) { // &按位與,運算符兩邊的條件值會先轉換為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. |(按位或運算符)
|
按位或和&
按位與計算方式都是轉換二進制再計算,不同的是運算規(guī)則(一個為真即為真):1|0 = 1 , 1|1 = 1 , 0|0 = 0 , 0|1 = 1
public class Main { public static void main(String[] args) { // |按位或,運算符兩邊的條件值會先轉換為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. >> (右移移運算符)
凡位運算符都是把值先轉換成二進制再進行后續(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 想轉為負的十進制,因為最高位是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 } }
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!
相關文章
Java Web項目中實現(xiàn)文件下載功能的實例教程
這篇文章主要介紹了Java Web項目中實現(xiàn)文件下載功能的實例教程,分別講解了通過超鏈接實現(xiàn)下載以及通過Servlet程序實現(xiàn)下載的方式,需要的朋友可以參考下2016-05-05使用list stream:對List中的對象先進行排序再獲取前n個對象
這篇文章主要介紹了使用list stream:對List中的對象先進行排序再獲取前n個對象,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09JAVA下單接口優(yōu)化實戰(zhàn)TPS性能提高10倍
今天小編就為大家分享一篇關于JAVA下單接口優(yōu)化實戰(zhàn)TPS性能提高10倍,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12