位图数据结构原理分析总结

看编程珠玑(第二版)第一章时,因对对位图不明白是怎么运行的所以特地去百度了下,发现写的不是很清楚,所以就参照着两个对我帮助最大的链接做了下总结:

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;

注:此文主要阐述了存放数据的原理,并不涉及任何运算。因本人也是初涉,如有错误或遗漏,还请大神不吝补充指教。

posted on 2018-01-25 12:22  浅灰色的记忆  阅读(2290)  评论(0编辑  收藏  举报