位圖數據結構原理分析總結
看編程珠璣(第二版)第一章時,因對對位圖不明白是怎么運行的所以特地去百度了下,發現寫的不是很清楚,所以就參照着兩個對我幫助最大的鏈接做了下總結:
https://www.iteblog.com/archives/148.html
http://blog.163.com/xb_stone_yinyang/blog/static/2118160372013625112558579/
c語言中的for each (i in arr)對應着Java語言的for(int i : arr)
位圖數據結構:
兩個主要運算(32為數組中一個元素的位數,因元素的類型改變,位數隨之改變):
字節位置=數據/32;(采用位運算即右移5位)
位位置=數據%32;(采用位運算即跟0X1F進行與操作)
* i >> SHIFT 相當於 i / (2 ^ SHIFT)
* i << SHIFT 相當於 i (2 ^ SHIFT)
* i & MASK相當於mod操作 m mod n 運算(即Java中的 m % n)
0b111中的b(binary,表示該數是二進制),即該數表示二進制中的111,十進制的7
char arr[] 數組中的每個元素,占用一個字節,因每個字節八位,所以每一位又可以代表一個數字,所以當每一個位數被占用的時候即說明該數字已存在。
在32位機中,char表示1個字節8位,int表示4個字節32位
如 char arr[] = new char[3]
arr[0]就表示第一個字節,第一個字節中的8位(即0~7)
arr[1]就表示第二個字節,第二個字節中的8位(即8~15)
arr[2]就表示第三個字節,第三個字節中的8位(即16~23)
又如 int arr[] = new int[3]
arr[0]就表示0~3個字節:
第一個字節中的8位(即0~7)、第二個字節中的8位(即8~15)、第三個字節中的8位(即16~23)、第三個字節中的8位(即24~31)
arr[1]就表示4~7個字節:
第一個字節中的8位(即32~39)、第二個字節中的8位(即40~47)、第三個字節中的8位(即48~55)、第三個字節中的8位(即56~63)
arr[2]就表示8~11個字節:
第一個字節中的8位(即64~71)、第二個字節中的8位(即72~79)、第三個字節中的8位(即80~87)、第三個字節中的8位(即88~95)
仔細理解上文中字節的位置和位的位置,可以幫助你快速理解位圖機制。
最后對基本類型占用的字節數和位置不是很清楚的可以參考鏈接:https://www.cnblogs.com/123hll/p/5805040.html;
注:此文主要闡述了存放數據的原理,並不涉及任何運算。因本人也是初涉,如有錯誤或遺漏,還請大神不吝補充指教。