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