八位图 16位图_了解位图
八位圖 16位圖
幾周前,我和Alistair正在研究用于對(duì)節(jié)點(diǎn)附加到Neo4j數(shù)據(jù)庫中的標(biāo)簽進(jìn)行建模的代碼。
這種工作方式是將32個(gè)節(jié)點(diǎn)ID的塊表示為每個(gè)標(biāo)簽的32位位圖 ,其中1表示1表示節(jié)點(diǎn)具有標(biāo)簽,0表示沒有標(biāo)簽。
例如,假設(shè)我們有節(jié)點(diǎn)ID 0-31,其中0是最高位,而31是最低位。 如果只有節(jié)點(diǎn)0具有標(biāo)簽,則將其表示為以下值:
如果我們想象32位彼此相鄰放置,它將看起來像這樣 :
java> 0X80000000; Integer res16 = -2147483648
我們要做的下一件事是確定節(jié)點(diǎn)是否應(yīng)用了標(biāo)簽。 我們可以通過使用按位AND來實(shí)現(xiàn)。
例如,要檢查是否設(shè)置了最高位,我們將編寫以下代碼:
java> bitmap & (1 << 31); Integer res10 = -2147483648正如我們所想象的那樣。 現(xiàn)在讓我們檢查一下一些我們尚未設(shè)置的位:
java> bitmap & (1 << 0); Integer res11 = 0java> bitmap & (1 << 1); Integer res12 = 0java> bitmap & (1 << 30); Integer res13 = 0我們可能要執(zhí)行的另一項(xiàng)操作是在現(xiàn)有位圖上設(shè)置另一位,我們可以對(duì)其使用按位“或”運(yùn)算。
按位“或”表示如果一個(gè)值設(shè)置了該位或兩個(gè)值都設(shè)置了,則將置位。
讓我們?cè)O(shè)置第二高的位。 并可視化該計(jì)算:
如果我們?cè)u(píng)估,我們期望設(shè)置兩個(gè)最高位:
java> bitmap |= (1 << 30); Integer res14 = -1073741824現(xiàn)在,如果我們可視化位圖,我們將看到確實(shí)如此:
java> 0XC0000000; Integer res15 = -1073741824
我們要做的下一個(gè)操作是取消設(shè)置已經(jīng)設(shè)置好的位,可以使用按位異或。
異或表示只有在計(jì)算中包含(0和1)或(1和0)的組合時(shí),該位才會(huì)保持設(shè)置狀態(tài)。 如果有兩個(gè)1或2 0,那么它將被取消設(shè)置。
讓我們?nèi)∠O(shè)置第二高的位,以便僅設(shè)置最高位。
如果我們形象化地進(jìn)行以下計(jì)算:
并且如果我們?cè)u(píng)估返回到原始位圖:
java> bitmap ^= (1 << 30); Integer res2 = -2147483648我使用Java REPL評(píng)估了本文中的代碼示例,并且本文非常清楚地解釋了移位運(yùn)算符 。
這篇文章中描述的Neo4j版本的位圖位于github上的BitmapFormat類中。
翻譯自: https://www.javacodegeeks.com/2014/01/learning-about-bitmaps.html
八位圖 16位圖
總結(jié)
以上是生活随笔為你收集整理的八位图 16位图_了解位图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 死骑邪恶天赋加点(邪恶死亡骑士堆什么属性
- 下一篇: .net2.0 orm_Hibernat