摘要:閱讀原文輕松搞定位運(yùn)算我們?nèi)粘i_發(fā)中為運(yùn)算使用的并不多,但如果能巧妙的使用位運(yùn)算可以減少運(yùn)行開銷和優(yōu)化算法,通過的源碼可知,如。按位非操作十進(jìn)制二進(jìn)制操作數(shù)后結(jié)果總結(jié)對(duì)每位進(jìn)行取反。
閱讀原文:輕松搞定Java位運(yùn)算
我們?nèi)粘i_發(fā)中為運(yùn)算使用的并不多,但如果能巧妙的使用位運(yùn)算可以減少運(yùn)行開銷和優(yōu)化算法,通過Java的源碼可知,如HashMap。
單位換算bit:位
一個(gè)二進(jìn)制數(shù)據(jù)0或1,是1bit;
byte:字節(jié)
1 byte = 8 bit , 存儲(chǔ)空間的基本計(jì)量單位
一個(gè)英文字符占一個(gè)字節(jié);
1 字母 = 1 byte = 8 bit
一個(gè)漢字占2個(gè)字節(jié);
1 漢字 = 2 byte = 16 bit
首先明確一點(diǎn),Java中的位運(yùn)算是針對(duì)整型的數(shù)據(jù)類型進(jìn)行運(yùn)算的,所以操作數(shù)必須是一下五種之一。
數(shù)據(jù)類型 | 所占位數(shù)(bit) |
---|---|
byte | 8 |
short | 16 |
int | 32 |
long | 64 |
char | 16 |
計(jì)算機(jī)中存儲(chǔ)的數(shù)據(jù)最終是以二進(jìn)制存儲(chǔ),如int類型的十進(jìn)制數(shù)字10表示為32bit的二進(jìn)制:
0000 0000 0000 0000 0000 0000 0000 1010
位運(yùn)算符運(yùn)算符 | 意義 |
---|---|
& | 按位與 |
| | 按位或 |
~ | 按位非 |
^ | 按位異或 |
<< | 左移 |
>> | 右移 |
<<< | 無符號(hào)右移 |
操作 | 十進(jìn)制 | 二進(jìn)制 | |
---|---|---|---|
操作數(shù)1 | 3 | 0 0 1 1 | |
操作數(shù)2 | 5 | 0 1 0 1 | |
& 后結(jié)果 | 1 | 0 0 0 1 |
總結(jié):對(duì)應(yīng)位同為1時(shí),才為1,否則全為0(對(duì)應(yīng)位只要有0,全為0,否則為1)。
另外:你可以把1理解為true,把0理解為false, true和false進(jìn)行與(&)時(shí),必須同為true時(shí)結(jié)果才為true.
按位或 |操作 | 十進(jìn)制 | 二進(jìn)制 | |
---|---|---|---|
操作數(shù)1 | 3 | 0 0 1 1 | |
操作數(shù)2 | 5 | 0 1 0 1 | |
| 后結(jié)果 | 7 | 0 1 1 1 |
總結(jié):對(duì)應(yīng)位只要有1時(shí),即為1,否則全為0(對(duì)應(yīng)位只有全是0時(shí),結(jié)果才是0,否則為1)。
另外:你可以把1理解為true,把0理解為false, true和false進(jìn)行或(|)時(shí),只要有true,結(jié)果即為true。
按位非~操作 | 十進(jìn)制 | 二進(jìn)制 | |
---|---|---|---|
操作數(shù)1 | 3 | 0 0 1 1 | |
~ 后結(jié)果 | 12 | 1 1 0 0 |
總結(jié):對(duì)每位進(jìn)行取反。
按位異或 ^操作 | 十進(jìn)制 | 二進(jìn)制 | |
---|---|---|---|
操作數(shù)1 | 3 | 0 0 1 1 | |
操作數(shù)2 | 5 | 0 1 0 1 | |
^ 后結(jié)果 | 7 | 0 1 1 0 |
總結(jié):只要對(duì)應(yīng)為不同即為1
左移<< 和 右移 >>通過下面的圖更加直觀:
左移總結(jié)
m< 右移總結(jié) m>>n即相當(dāng)于m除以2的n次方,得到的為整數(shù)時(shí),即為結(jié)果。如果結(jié)果為小數(shù),此時(shí)會(huì)出現(xiàn)兩種情況: 如果m為正數(shù),得到的商會(huì)無條件 的舍棄小數(shù)位; 如果m為負(fù)數(shù),舍棄小數(shù)部分,然后把整數(shù)部分加+1得到位移后的值。 無符號(hào)右移>>> 與 右移>> 的區(qū)別就是無論操作數(shù)是正數(shù)還是負(fù)數(shù),高位都是補(bǔ)0。 歡迎關(guān)注公眾號(hào)交流!溢出情況舉例:5<<29,相當(dāng)于 (2^2 + 1) * 2^29 ,這個(gè)結(jié)果顯然大于正數(shù)的最大值 2^31-1,所以得出的是個(gè)負(fù)數(shù)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/73678.html
摘要:除法運(yùn)算符總是返回浮點(diǎn)數(shù)。取模運(yùn)算符的結(jié)果和被除數(shù)的符號(hào)正負(fù)號(hào)相同。使用位運(yùn)算符時(shí)要特別注意優(yōu)先級(jí)。太空船運(yùn)算符組合比較符當(dāng)小于等于大于時(shí)分別返回一個(gè)小于等于大于的值。遞增遞減運(yùn)算符不影響布爾值。 一、算術(shù)運(yùn)算符 1. 概覽 例子 名稱 結(jié)果 $a + $b 加法 $a 和 $b 的和。 $a - $b 減法 $a 和 $b 的差。 $a * $b 乘法 $a 和 ...
摘要:聽了鵬哥的教導(dǎo),也開始寫起了博客現(xiàn)在多粉,感覺都是機(jī)器人哈哈,最近粉絲也不漲了,不知道是不是我最近不發(fā)文章的原因。這一個(gè)多月,基本就是學(xué)刷算法題。在這里不得不吐槽一下學(xué)校,每條早上做早操,晚自習(xí)到點(diǎn),感覺浪費(fèi)了我很多學(xué)習(xí)技術(shù)的時(shí)間。 ...
摘要:虛擬機(jī)在執(zhí)行字節(jié)碼時(shí),把字節(jié)碼解釋成具體平臺(tái)上的機(jī)器指令執(zhí)行。總體來說就是,我們利用調(diào)用開發(fā)了屬于我們自己的程序后,通過中的編譯程序?qū)⑽覀兊奈谋疚募幾g成字節(jié)碼,在上運(yùn)行這些字節(jié)碼,解析這些字節(jié)碼,映射到指令集或的系統(tǒng)調(diào)用。 1.簡述JDK、JRE、JVM? 一、JDK JDK(Java Development Kit) 是整個(gè)JAVA的核心, 包括了Java運(yùn)行環(huán)境(Java Ru...
摘要:虛擬機(jī)在執(zhí)行字節(jié)碼時(shí),把字節(jié)碼解釋成具體平臺(tái)上的機(jī)器指令執(zhí)行。總體來說就是,我們利用調(diào)用開發(fā)了屬于我們自己的程序后,通過中的編譯程序?qū)⑽覀兊奈谋疚募幾g成字節(jié)碼,在上運(yùn)行這些字節(jié)碼,解析這些字節(jié)碼,映射到指令集或的系統(tǒng)調(diào)用。 1.簡述JDK、JRE、JVM? 一、JDK JDK(Java Development Kit) 是整個(gè)JAVA的核心, 包括了Java運(yùn)行環(huán)境(Java Ru...
閱讀 1652·2021-08-13 15:03
閱讀 2082·2019-08-30 15:54
閱讀 3544·2019-08-26 10:30
閱讀 1020·2019-08-26 10:22
閱讀 2746·2019-08-23 14:42
閱讀 1809·2019-08-22 11:16
閱讀 1038·2019-08-21 18:33
閱讀 3159·2019-08-21 17:28