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