Java中的位運(yùn)算符全解
1. &(按位與運(yùn)算符)
&
按位與的運(yùn)算規(guī)則是將兩邊的數(shù)轉(zhuǎn)換為二進(jìn)制位,然后運(yùn)算最終值,運(yùn)算規(guī)則即(兩個為真才為真):1&1=1 , 1&0=0 , 0&1=0 , 0&0=0
public class Main { public static void main(String[] args) { // &按位與,運(yùn)算符兩邊的條件值會先轉(zhuǎn)換為2進(jìn)制,然后再比對運(yùn)算 /** * 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. |(按位或運(yùn)算符)
|
按位或和&
按位與計算方式都是轉(zhuǎn)換二進(jìn)制再計算,不同的是運(yùn)算規(guī)則(一個為真即為真):1|0 = 1 , 1|1 = 1 , 0|0 = 0 , 0|1 = 1
public class Main { public static void main(String[] args) { // |按位或,運(yùn)算符兩邊的條件值會先轉(zhuǎn)換為2進(jìn)制,然后再比對運(yùn)算 /** * 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. ^(異或運(yùn)算符)
^
異或運(yùn)算符顧名思義,異就是不同,其運(yùn)算規(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. <<(左移運(yùn)算符)
5<<2的意思為5的二進(jìn)制位往左挪兩位,右邊補(bǔ)0
5的二進(jìn)制位是0000 0101
, 就是把有效值101往左挪兩位就是0001 0100
,正數(shù)左邊第一位補(bǔ)0,負(fù)數(shù)補(bǔ)1,等于乘于2的n次方,十進(jìn)制位是5*2^2=20
public class Main { public static void main(String[] args) { /** * 5<<2的意思為5的二進(jìn)制位往左挪兩位,右邊補(bǔ)0 * 0 0 0 0 0 1 0 1 * 0 0 0 1 0 1 0 0 */ System.out.println(5<<2); // 20 } }
5. >> (右移移運(yùn)算符)
凡位運(yùn)算符都是把值先轉(zhuǎn)換成二進(jìn)制再進(jìn)行后續(xù)的處理
5的二進(jìn)制位是0000 0101,右移兩位就是把101左移后為0000 0001,正數(shù)左邊第一位補(bǔ)0,負(fù)數(shù)補(bǔ)1,等于除于2的n次方,結(jié)果為1
public class Main { public static void main(String[] args) { /** * 5>>2的意思為5的二進(jìn)制位往右挪兩位,左邊補(bǔ)0 * 0 0 0 0 0 1 0 1 * 0 0 0 0 0 0 0 1 */ System.out.println(5<<2); // 1 } }
6. ~(取反運(yùn)算符)
取反就是1為0,0為1
5的二進(jìn)制位是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)為負(fù)的十進(jìn)制,因為最高位是1,所以先將11111001減1得到11111001 * 2、取反 00010101,然后計算出 00000100 對應(yīng)的十進(jìn)制為6 * 3、所以 11111010 最終對應(yīng)的十進(jìn)制為 -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. >>>(無符號右移運(yùn)算符)
(1) 正數(shù)無符號右移
無符號右移運(yùn)算符和右移運(yùn)算符的主要區(qū)別在于負(fù)數(shù)的計算,因為無符號右移是高位補(bǔ)0,移多少位補(bǔ)多少個0。
15的二進(jìn)制位是0000 1111 , 右移2位0000 0011,結(jié)果為3
public class Main { public static void main(String[] args) { /** * 0000 1111 * --------------- * 0000 0011 */ System.out.println(15>>>2); // 3 } }
(2) 負(fù)數(shù)無符號右移
-6的二進(jìn)制是6的二進(jìn)制取反再加1,6的二進(jìn)制也就是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 } }
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java Web項目中實(shí)現(xiàn)文件下載功能的實(shí)例教程
這篇文章主要介紹了Java Web項目中實(shí)現(xiàn)文件下載功能的實(shí)例教程,分別講解了通過超鏈接實(shí)現(xiàn)下載以及通過Servlet程序?qū)崿F(xiàn)下載的方式,需要的朋友可以參考下2016-05-05使用list stream:對List中的對象先進(jìn)行排序再獲取前n個對象
這篇文章主要介紹了使用list stream:對List中的對象先進(jìn)行排序再獲取前n個對象,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09Flowable?設(shè)置任務(wù)處理人的四種方式詳解
這篇文章主要為大家介紹了Flowable?設(shè)置任務(wù)處理人的四種方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10JAVA下單接口優(yōu)化實(shí)戰(zhàn)TPS性能提高10倍
今天小編就為大家分享一篇關(guān)于JAVA下單接口優(yōu)化實(shí)戰(zhàn)TPS性能提高10倍,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12java多線程編程之慎重使用volatile關(guān)鍵字
volatile關(guān)鍵字相信了解Java多線程的讀者都很清楚它的作用。volatile關(guān)鍵字用于聲明簡單類型變量,下面看一下為什么要慎重使用volatile關(guān)鍵字2014-01-01