了解位图
幾周前,我和Alistair一起研究了用于對Neo4j數(shù)據(jù)庫中節(jié)點已附加到其上的標(biāo)簽進(jìn)行建模的代碼。
這種工作方式是將32個節(jié)點ID的塊表示為每個標(biāo)簽的32位位圖 ,其中位1表示節(jié)點具有標(biāo)簽,而0表示沒有標(biāo)簽。
例如,假設(shè)我們有節(jié)點ID 0-31,其中0是最高位,而31是最低位。 如果只有節(jié)點0具有標(biāo)簽,則將其表示為以下值:
如果我們想象32位彼此相鄰放置,它將看起來像這樣 :
java> 0X80000000; Integer res16 = -2147483648
我們要做的下一件事是確定節(jié)點是否應(yīng)用了標(biāo)簽。 我們可以通過按位與來實現(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àn)有位圖上設(shè)置另一位,我們可以對其使用按位“或”運算。
按位“或”或“或”表示如果一個值設(shè)置了該位或兩個值都設(shè)置了,則將置位。
讓我們設(shè)置第二高的位。 并可視化該計算:
如果我們評估,我們期望設(shè)置兩個最高位:
java> bitmap |= (1 << 30); Integer res14 = -1073741824現(xiàn)在,如果我們可視化位圖,我們將看到確實如此:
java> 0XC0000000; Integer res15 = -1073741824
我們要執(zhí)行的下一個操作是取消設(shè)置已經(jīng)設(shè)置的位,可以使用按位異或。
異或表示只有在計算中包含(0和1)或(1和0)的組合時,該位才保持設(shè)置。 如果有兩個1或2 0,那么它將被取消設(shè)置。
讓我們?nèi)∠O(shè)置第二高的位,以便僅設(shè)置最高位。
如果我們直觀地看到,我們將進(jìn)行以下計算:
并且如果我們評估返回到原始位圖:
java> bitmap ^= (1 << 30); Integer res2 = -2147483648我使用Java REPL評估了本文中的代碼示例,并且本文非常清楚地解釋了移位運算符 。
這篇文章中描述的Neo4j版本的位圖位于github上的BitmapFormat類中。
翻譯自: https://www.javacodegeeks.com/2014/01/learning-about-bitmaps.html
總結(jié)
- 上一篇: 发晶佩戴的方法与禁忌(发晶虽好看,佩戴也
- 下一篇: 装饰图案