Java中的位運(yùn)算符號(hào)解讀(&、|、^、~、<<、>>、>>>)
1. 位運(yùn)算符號(hào)概覽
符號(hào) | 描述 | 運(yùn)算規(guī)則 |
---|---|---|
& | 與 | 兩個(gè)位都為1時(shí),結(jié)果才為1 |
| | 或 | 兩個(gè)位都為0時(shí),結(jié)果才為0 |
^ | 異或 | 兩個(gè)位相同為0,不同為1 |
~ | 取反 | 所有位置0變1,1變0 |
<< | 左移 | 各二進(jìn)位全部左移若干位,高位丟棄,低位補(bǔ)0 |
>> | 帶符號(hào)右移 | 各二進(jìn)位全部右移若干位,低位丟棄,高位補(bǔ)為符號(hào)位 |
>>> | 無(wú)符號(hào)右移 | 各二進(jìn)位全部右移若干位,低位丟棄,高位補(bǔ)0 |
還有兩個(gè)符號(hào),并不是位運(yùn)算符,但是容易與位運(yùn)算符混淆,后面將與其相似的位運(yùn)算符進(jìn)行一并講解:
符號(hào) | 描述 | 運(yùn)算規(guī)則 |
---|---|---|
&& | 邏輯與 | 左右表達(dá)式均為true時(shí),運(yùn)算最終結(jié)果才為true |
|| | 邏輯非 | 左右表達(dá)式只要有一個(gè)為true,運(yùn)算最終結(jié)果就為true |
2. 一個(gè)工具
下面的函數(shù)可以幫助我們打印Java中int整型的在底層的32位信息,后面可以使用該工具對(duì)程序進(jìn)行調(diào)試:
public static void print(int num) { for (int i = 31; i >= 0; i--) { System.out.print((num & (1 << i)) == 0 ? "0" : "1"); } System.out.println(); } // print(1); --> 00000000000000000000000000000001 // print(-1); --> 11111111111111111111111111111111 // print(Integer.MAX_VALUE); --> 01111111111111111111111111111111 // print(Integer.MAX_VALUE); --> 10000000000000000000000000000000
下面開(kāi)始對(duì)每個(gè)符號(hào)進(jìn)行介紹。
3. 按位與(&)、邏輯與(&&)
**按位與(&)**的具體運(yùn)算規(guī)則為:
1 & 1 = 1 1 & 0 = 0 0 & 1 = 0 0 & 0 = 0
// 舉例: print(123); // 00000000000000000000000001111011 print(321); // 00000000000000000000000101000001 print(a & b); // 00000000000000000000000001000001 // 任何數(shù)與0相與都等于0 // 任何數(shù)與自己相與都等于自己
在Java中,(&)不僅可以作為位運(yùn)算符號(hào),同樣也可以作為邏輯與符號(hào),
要注意:(&&)并不是位運(yùn)算符號(hào),不可以參與位運(yùn)算!
**邏輯與(&)、邏輯與(&&)**的具體運(yùn)算規(guī)則為:
true & true = true true & false = false false & true = false false & false = false true && true = true true && false = false false && true = false false && false = false
兩者的區(qū)別在于:
**邏輯與(&)**在運(yùn)算時(shí),不論(&)前面的表達(dá)式的結(jié)果是否為false,(&)后面的表達(dá)式都會(huì)執(zhí)行運(yùn)算;
而**邏輯與(&&)**在運(yùn)算時(shí),如果(&&)前面的表達(dá)式的結(jié)果為false,則(&&)后面的表達(dá)式就不會(huì)執(zhí)行運(yùn)算。
4.按位或(|)、邏輯或(||)
**按位與(&)**的具體運(yùn)算規(guī)則為:
1 | 1 = 1 1 | 0 = 1 0 | 1 = 1 0 | 0 = 0
// 舉例: print(123); // 00000000000000000000000001111011 print(321); // 00000000000000000000000101000001 print(a | b); // 00000000000000000000000101111011 // 任何數(shù)與0相或都等于自身 // 任何數(shù)與自己相或都等于自己
在Java中,(|)不僅可以作為位運(yùn)算符號(hào),同樣也可以作為邏輯與符號(hào)。
要注意:(||)并不是位運(yùn)算符號(hào),不可以參與位運(yùn)算!
**邏輯或(|)、邏輯或(||)**的具體運(yùn)算規(guī)則為:
true | true = true true | false = true false | true = true false | false = false true || true = true true || false = true false || true = true false || false = false
兩者的區(qū)別在于:
**邏輯或(|)**在運(yùn)算時(shí),不論(|)前面的表達(dá)式的結(jié)果是否為true,(|)后面的表達(dá)式都會(huì)執(zhí)行運(yùn)算;
而**邏輯或(||)**在運(yùn)算時(shí),如果(||)前面的表達(dá)式的結(jié)果為true,則(||)后面的表達(dá)式就不會(huì)執(zhí)行運(yùn)算。
5. 異或(^)
**異或(^)**的具體運(yùn)算規(guī)則為:
1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 1 = 1 0 ^ 0 = 0
// 即相同為0,不同為1
// 舉例: print(123); // 00000000000000000000000001111011 print(321); // 00000000000000000000000101000001 print(a ^ b); // 00000000000000000000000100111010 // 任何數(shù)與0異或都等于自身 // 任何數(shù)與自己異或都為0
6. 取反(~)
**取反(~)**的具體運(yùn)算規(guī)則為:
~1 = 0 ~0 = 1
// 舉例: print(123); // 00000000000000000000000001111011 print(~a); // 11111111111111111111111110000100 // 符號(hào)位也取反
**取反(~)**可以用來(lái)求相反數(shù):
// 一個(gè)32整數(shù),取反再+1,就是該數(shù)的相反數(shù),效果等同于加負(fù)號(hào)(-) int a = 123; System.out.println(a); // 123 System.out.println(~a+1); // -123
說(shuō)明:
由于Java中int類型的整數(shù)范圍為 − 2 31 ∼ 2 31 − 1 -2^{31}\sim2^{31}-1 −231∼231−1,負(fù)數(shù)的個(gè)數(shù)比正數(shù)多一個(gè),這樣就導(dǎo)致,所有的正數(shù)都有相應(yīng)的負(fù)的相反數(shù),但是并不是所有的負(fù)數(shù)都有正的相反數(shù):
a = Integer.MIN_VALUE; System.out.println(a); // -2147483648 print(a); // 10000000000000000000000000000000 System.out.println(~a+1); // -2147483648 print(~a + 1); // 10000000000000000000000000000000 // Java中int整數(shù)最小值的相反數(shù)還是其自身 // 如果一定需要對(duì)int整數(shù)最小值求相反數(shù),請(qǐng)將int類型換為long類型
7. 左移(<<)
左移表示的是某數(shù)的各二進(jìn)位全部左移若干位,高位丟棄,低位補(bǔ)0
// 舉例: print(123); // 00000000000000000000000001111011 print(123 << 1); // 00000000000000000000000011110110 // 整體左移1位,高位丟棄,低位補(bǔ)0
應(yīng)用:
// 左移1位相當(dāng)于在原數(shù)的基礎(chǔ)上乘以2 System.out.println(123); // 123 System.out.println(123<<1); // 246 // 左移2位相當(dāng)于在原數(shù)的基礎(chǔ)上乘以4 System.out.println(2); // 2 System.out.println(2<<2); // 8 // 左移3位、4位...以此類推
8. 帶符號(hào)右移(>>)、無(wú)符號(hào)右移(>>>)
**帶符號(hào)右移(>>)**指的是各二進(jìn)位全部右移若干位,低位丟棄,高位補(bǔ)為符號(hào)位
**無(wú)符號(hào)右移(>>>)**指的是各二進(jìn)位全部右移若干位,低位丟棄,高位補(bǔ)0
int a = 123; print(a); // 00000000000000000000000001111011 print(a>>2); // 00000000000000000000000000011110 print(a>>>2); // 00000000000000000000000000011110 int b = -123; print(b); // 11111111111111111111111110000101 print(b>>2); // 11111111111111111111111111100001 print(b>>>2); // 00111111111111111111111111100001 // 區(qū)別就在于:一個(gè)高位用符號(hào)位補(bǔ),一個(gè)高位用0補(bǔ)
Java中沒(méi)有(<<<)符號(hào)?。?!
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
深入了解JVM(Java虛擬機(jī))內(nèi)存結(jié)構(gòu)
Java虛擬機(jī)(Java Virtual Machine,JVM)是Java程序的運(yùn)行環(huán)境,它是一個(gè)抽象的計(jì)算機(jī)模型,通過(guò)解釋和執(zhí)行Java字節(jié)碼來(lái)運(yùn)行Java程序,本將大家深入了解JVM(Java虛擬機(jī))內(nèi)存結(jié)構(gòu),需要的朋友可以參考下2023-08-08SpringBoot混合使用StringRedisTemplate和RedisTemplate的坑及解決
這篇文章主要介紹了SpringBoot混合使用StringRedisTemplate和RedisTemplate的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12SpringBoot通過(guò)注解下載任意對(duì)象
下載功能應(yīng)該是比較常見(jiàn)的功能了,雖然一個(gè)項(xiàng)目里面可能出現(xiàn)的不多,但是基本上每個(gè)項(xiàng)目都會(huì)有,而且有些下載功能其實(shí)還是比較繁雜的,這篇文章主要介紹了SpringBoot一個(gè)注解就能幫你下載任意對(duì)象,需要的朋友可以參考下2023-08-08Spring類型轉(zhuǎn)換 ConversionSerivce Convertor解析
這篇文章主要介紹了Spring類型轉(zhuǎn)換 ConversionSerivce Convertor的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11關(guān)于springboot的接口返回值統(tǒng)一標(biāo)準(zhǔn)格式
這篇文章主要介紹了關(guān)于springboot的接口返回值統(tǒng)一標(biāo)準(zhǔn)格式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05SpringBoot請(qǐng)求參數(shù)傳遞與接收說(shuō)明小結(jié)
這篇文章主要介紹了SpringBoot請(qǐng)求參數(shù)傳遞與接收,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12SpringBoot2零基礎(chǔ)到精通之JUnit 5與指標(biāo)監(jiān)控
SpringBoot是一種整合Spring技術(shù)棧的方式(或者說(shuō)是框架),同時(shí)也是簡(jiǎn)化Spring的一種快速開(kāi)發(fā)的腳手架,本篇讓我們一起學(xué)習(xí)JUnit 5與指標(biāo)監(jiān)控2022-03-03