一定要讓你搞懂Java位運(yùn)算符
常用的運(yùn)算符
在Java語(yǔ)言中,官方給我們提供了極為豐富的運(yùn)算操作,但是常用的,好像也就是算術(shù)運(yùn)算符,例如加、減、乘、除、取余等。還有就是關(guān)系運(yùn)算符大于、小于、等于、不等于等。再或者就是邏輯運(yùn)算符&&、||、!等,至于位運(yùn)算符,屬實(shí)用的不多。用的不多今天為什么拿出來(lái)講呢,首先這可以幫助你很好的去理解計(jì)算機(jī)的底層原理,其次可以讓你在面試中略勝一籌,還有就是有些人分不清邏輯運(yùn)算符和位運(yùn)算符的區(qū)別,例如&&和&,||和|,區(qū)別分別是什么,反正剛開(kāi)始我是有點(diǎn)迷惑,所以這篇文章呢,也算是為自己解惑了。

位運(yùn)算符
位運(yùn)算符,從字面意思上看,就可以知道,是位運(yùn)算,其實(shí)并不難,只是我們不經(jīng)常用,再加上跟邏輯運(yùn)算符的混淆,所以就容易讓人迷迷糊糊。這里主要講解&、|、^、~、>>、<<、>>>。其中 ~ 和 >>> 較為復(fù)雜。
&、|、^ 運(yùn)算符
&是按位與,|是按位或、^是按位異或,這三種位運(yùn)算相對(duì)簡(jiǎn)單,下面給出程序截圖,大家應(yīng)該可以一目了然。

~ 運(yùn)算符
首先我們要清楚,數(shù)字在計(jì)算機(jī)中是以二進(jìn)制存儲(chǔ)的,準(zhǔn)確的說(shuō)是以二進(jìn)制的補(bǔ)碼形式存儲(chǔ)的,我們看到的數(shù)一般是以二進(jìn)制的原碼形式轉(zhuǎn)化為十進(jìn)制展示的,正數(shù)的原碼、反碼、補(bǔ)碼是其本身,而負(fù)數(shù)的反碼是符號(hào)位不變,其余取反。負(fù)數(shù)的補(bǔ)碼是其反碼+1。這里通過(guò)簡(jiǎn)單的例子,來(lái)解釋原碼、反碼、補(bǔ)碼。
我們以數(shù)字5為例,這里通過(guò)一個(gè)字節(jié)來(lái)進(jìn)行講解。5的原碼是00000101,反碼也是00000101,補(bǔ)碼還是00000101,其中在計(jì)算機(jī)存儲(chǔ)的是補(bǔ)碼。如果對(duì)5進(jìn)行取反是什么呢,5的原碼取反之后是11111010,提醒:(最高位1表示該數(shù)是負(fù)數(shù),0表示該數(shù)是正數(shù))。但是計(jì)算機(jī)中存儲(chǔ)的是補(bǔ)碼,按上面所說(shuō)的,負(fù)數(shù)的補(bǔ)碼是反碼加1。反碼是10000101(負(fù)數(shù)的反碼是不改變符號(hào)位哦),這里的第一個(gè)1就是是表示符號(hào),再加1,就是補(bǔ)碼10000110,也就是我們看到的-6。說(shuō)明:取反是把所有的1變成0,所有的0變成1,反碼是除了符號(hào)位不變,其余的1變0,0變1。

<< 和 >> 運(yùn)算符
簡(jiǎn)單的理解,<<1 是乘2,>>1是除以2,其中正數(shù)右移是前補(bǔ)0,負(fù)數(shù)右移是前補(bǔ)1。這里的運(yùn)算要比* /的速度快,看JDK原碼的時(shí)候,大家應(yīng)該都見(jiàn)過(guò)這些符號(hào)。

>>> 運(yùn)算符
這個(gè)是無(wú)符號(hào)右移,什么叫無(wú)符號(hào)呢,首先說(shuō)一下什么是有符號(hào)右移,有符號(hào)右移,也就是,當(dāng)該數(shù)字是正數(shù),右移前補(bǔ)0,當(dāng)該數(shù)字是負(fù)數(shù),右移前補(bǔ)1。而無(wú)符號(hào)右移不管是正數(shù)還是負(fù)數(shù),都是前補(bǔ)0。這里以-5為例子進(jìn)行講解,通過(guò)無(wú)符號(hào)右移,負(fù)數(shù)變正數(shù)。

有<<<運(yùn)算符嗎
先說(shuō)結(jié)論,是沒(méi)有<<<運(yùn)算符的,因?yàn)槲覀冎涝谟乙频臅r(shí)候,存在著高位是補(bǔ)0還是補(bǔ)1的選擇,如果是普通的右移,根據(jù)原數(shù)字的正負(fù)來(lái)決定是補(bǔ)0還是補(bǔ)1,而無(wú)符號(hào)右移,則高位通通補(bǔ)1。因?yàn)楦呶皇菦Q定一個(gè)數(shù)的正負(fù)的,而在左移的時(shí)候,是在最低位補(bǔ)0,高位的數(shù)字是由高位右邊的第一個(gè)數(shù)字決定的,所以不存在補(bǔ)0還是補(bǔ)1的情況,所以沒(méi)有無(wú)符號(hào)左移。
為什么8位是-128 ~ 127
既然聊到這了,順便解釋一下,為什么占8位的數(shù)字范圍是-128 ~ 127,首先,我們要注意0這個(gè)數(shù)是屬于 -128 ~ 127的,也就是說(shuō),這一共有256個(gè)數(shù)字,而127的二進(jìn)制表示就是0111 1111,0的二進(jìn)制是0000 0000,1000 0000,這個(gè)按說(shuō)是-0,但是0和-0是不是就重復(fù)了,所以規(guī)定-0就表示-128,也就是1000 0000表示-128,1111 1111這個(gè)二進(jìn)制表示的是-127哦。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
關(guān)于Java的Condition接口最佳理解方式
這篇文章主要介紹了關(guān)于Java的Condition接口最佳理解方式,Condition就是實(shí)現(xiàn)了管程里面的條件變量,Java?語(yǔ)言內(nèi)置的管程里只有一個(gè)條件變量,而Lock&Condition實(shí)現(xiàn)的管程支持多個(gè)條件變量,需要的朋友可以參考下2023-05-05
spring-boot中spring-boot-maven-plugin報(bào)紅錯(cuò)誤及解決
這篇文章主要介紹了spring-boot中spring-boot-maven-plugin報(bào)紅錯(cuò)誤及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
詳解MyBatis-Plus Wrapper條件構(gòu)造器查詢大全
這篇文章主要介紹了詳解MyBatis-Plus Wrapper條件構(gòu)造器查詢大全,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
深入淺析Random類在高并發(fā)下的缺陷及JUC對(duì)其的優(yōu)化
這篇文章主要介紹了Random類在高并發(fā)下的缺陷及JUC對(duì)其的優(yōu)化 ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
Java高級(jí)特性基礎(chǔ)之反射五連問(wèn)
反射賦予了我們?cè)谶\(yùn)行時(shí)分析類以及執(zhí)行類中方法的能力。通過(guò)反射你可以獲取任意一個(gè)類的所有屬性和方法,你還可以調(diào)用這些方法和屬性。本文就來(lái)和大家詳細(xì)聊聊Java中的反射,感興趣的可以了解一下2023-01-01
IDEA報(bào)錯(cuò):Process terminated的問(wèn)題及解決
這篇文章主要介紹了IDEA報(bào)錯(cuò):Process terminated的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Java中成員方法與成員變量訪問(wèn)權(quán)限詳解
在Java學(xué)習(xí)過(guò)程中,在寫類經(jīng)常為用到public,private和protected,我個(gè)人的經(jīng)驗(yàn)是一般類的成員變量都是用private,方法用public,類的內(nèi)部用protected方法,如果是存在子類的,那我就會(huì)把父類中的成員變量變?yōu)閜rotected。(其余的看具體實(shí)際情 況而定)2015-08-08
Java 判斷字符串a(chǎn)和b是否互為旋轉(zhuǎn)詞
本篇文章主要介紹了判斷字符串a(chǎn)和b是否互為旋轉(zhuǎn)詞的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-05-05

