bitmap
节约内存,用一个位去表示两种状态.对于数据量比较多的开关量非常适用。
linux提供了相关的接口进行初始化和操作bitmap.
include/linux/types.h
#define DECLARE_BITMAP(name,bits) \
unsigned long name[BITS_TO_LONGS(bits)]
bitmap_set
函数原型:
void bitmap_set(unsigned long *map, int start, int nr)
start: 起始位
nr : 长度
- 计算start位的WORD的指针地址
- 设置第一个WORD的相应高位为1
- 设置2~n-1(倒数第二个)数据的位为1(通过mask设置,一次设置BITS_PER_LONG位,mask_to_set = ~0UL)
- 设置最后一个数据的相应位为1,可能只有部分低位为1.
bitmap_clear
函数原型:
void bitmap_clear(unsigned long *map, int start, int nr)
start: 起始位
nr : 长度
- 计算start位的WORD的指针地址
- 清除第一个WORD的相应高位为0
- 清除2~n-1(倒数第二个)数据的位为0(通过mask设置,一次设置BITS_PER_LONG位,mask_to_set = ~0UL)
- 设置最后一个数据的相应位为0,可能只有部分低位为1.
__bitmap_empty
函数原型:
int __bitmap_empty(const unsigned long *bitmap, int bits)
功能: 0~bits位是否为空
- 计算总共多少个WORD,得到总共lim个
- 遍历bitmap[0~lim]是否有WORD不是0,有返回0
- 判断最后一个WORD是否有位为1,,有返回0
- return 1
__bitmap_full
函数原型:
int __bitmap_full(const unsigned long *bitmap, int bits)
功能:判断0~bits位是否全为1
- 计算总共多少个WORD,得到总共lim个
- 遍历bitmap[0~lim]是否有WORD为0,有返回0
- 判断最后一个WORD是否有位为0,有返回0
- return 1
__bitmap_equal
函数原型:
int __bitmap_equal(const unsigned long *bitmap1,
const unsigned long *bitmap2, int bits)
功能: 比较bitmap1和bitmap2 ,从0~bits位相等
- 计算总共多少个WORD,得到总共lim个
- 比较bitmap1[0~lim]和bitmap2[0~lim]是否相等,如果不相等返回0
- 比较最后一个WORD剩余位是否相等(异或bitmap1[lim]和bitmap2[lim],后与上mask)
__bitmap_shift_right
函数原型:
void __bitmap_shift_right(unsigned long *dst,
const unsigned long *src, int shift, int bits)
功能: 把长度为bits位的src右移shift位后保存到dst中
- 计算整个bitmap的长度为多少个WORD(lim),剩余的位数left, 计算公式bits = lim * BITS_PER_LONG + left
- 计算右移的WORD数off,和剩余的位数(rem) ,计算公式shift = off * BITS_PER_LONG + rem
- 右移bitmap[0~lim-1], 获取右移后,用下个WORD(或0)填充高位部分(upper),
获取右移得到的低位部分(lower), dst[0~lim-1] = upper | lower.- 如果是最后一个WORD,右移rem位后,高位用0填充;采用mask的方式实现
- 如果left不等于0,最后第2个WORD的upper部分,最后一个WORD只有部分bits,需要mask不属于的bits为0
- 把右移后,左边的相应的MSB位清0
__bitmap_shift_left
函数原型
void __bitmap_shift_left(unsigned long *dst,
const unsigned long *src, int shift, int bits)
功能: 把长度为bits位的src左移shift位后保存到dst中
整个流程跟__bit_shift_right一样,只是左移换成右移,低位填0.
- 计算整个bitmap的长度为多少个WORD(lim),剩余的位数left, 计算公式bits = lim * BITS_PER_LONG + left
- 计算右移的WORD数off,和剩余的位数(rem) ,计算公式shift = off * BITS_PER_LONG + rem
- 左移bitmap[lim-1~0],获取低位lower,获取高位,
dst[] = upper | lower- lower 是前一个WORD(src[k-1])的高rem位
- upper 是当前的WORD(src[k])的左移rem位
- src[lim-1]的WORD,如果left不为0, mask不属于bits的位为0
- 左移后的最后剩余WORD都需要清0
__bitmap_and
函数原型:
int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
const unsigned long *bitmap2, int bits)
功能: bitmap1和bitmap2进行与操作并把值保存到dst中。
__bitmap_or
函数原型:
void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
const unsigned long *bitmap2, int bits)
功能: bitmap1和bitmap2进行或操作并把值保存到dst中。
__bitmap_xor
函数原型:
void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
const unsigned long *bitmap2, int bits)
功能: bitmap1和bitmap2进行异或操作并把值保存到dst中。
__bitmap_andnot
函数原型:
int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
const unsigned long *bitmap2, int bits)
功能: bitmap1和bitmap2进行与非(~bitmap2)操作并把值保存到dst中。
__bitmap_intersects
函数原型:
int __bitmap_intersects(const unsigned long *bitmap1,
const unsigned long *bitmap2, int bits)
功能: bitmap1和bitmap2进行与的操作,如果存在都为1的位,返回1,不存在返回0
判断bitmap1和bitmap2是否有相同的位被设置
__bitmap_subset
函数原型:
int __bitmap_subset(const unsigned long *bitmap1,
const unsigned long *bitmap2, int bits)
功能: 判断bitmap2是否是bitmap1的子集,是返回1,不是返回0
__bitmap_weight
函数原型:
int __bitmap_weight(const unsigned long *bitmap, int bits)
功能: 计算汉明权重大小,即bitmap中1的个数
- 汉明权重 Hammingcode是指一个字串中非0符号的个数(TheHamming weight of a stringis
the number of symbols that are different from the zero-symbol ofthealphabetused.)
应用到2进制符号序列中来,即二进制串中1的个数就是该串的Hammingcode.
未完待续......