Linux-kernel-bitmap

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   : 长度
  1. 计算start位的WORD的指针地址
  2. 设置第一个WORD的相应高位为1
  3. 设置2~n-1(倒数第二个)数据的位为1(通过mask设置,一次设置BITS_PER_LONG位,mask_to_set = ~0UL)
  4. 设置最后一个数据的相应位为1,可能只有部分低位为1.

bitmap_clear

函数原型:

void bitmap_clear(unsigned long *map, int start, int nr)
start: 起始位
nr   : 长度   
  1. 计算start位的WORD的指针地址
  2. 清除第一个WORD的相应高位为0
  3. 清除2~n-1(倒数第二个)数据的位为0(通过mask设置,一次设置BITS_PER_LONG位,mask_to_set = ~0UL)
  4. 设置最后一个数据的相应位为0,可能只有部分低位为1.

__bitmap_empty
函数原型:

int __bitmap_empty(const unsigned long *bitmap, int bits)
功能: 0~bits位是否为空
  1. 计算总共多少个WORD,得到总共lim个
  2. 遍历bitmap[0~lim]是否有WORD不是0,有返回0
  3. 判断最后一个WORD是否有位为1,,有返回0
  4. return 1

__bitmap_full
函数原型:

int __bitmap_full(const unsigned long *bitmap, int bits)
功能:判断0~bits位是否全为1
  1. 计算总共多少个WORD,得到总共lim个
  2. 遍历bitmap[0~lim]是否有WORD为0,有返回0
  3. 判断最后一个WORD是否有位为0,有返回0
  4. return 1

__bitmap_equal
函数原型:

int __bitmap_equal(const unsigned long *bitmap1,
    const unsigned long *bitmap2, int bits)
功能: 比较bitmap1和bitmap2 ,从0~bits位相等
  1. 计算总共多少个WORD,得到总共lim个
  2. 比较bitmap1[0~lim]和bitmap2[0~lim]是否相等,如果不相等返回0
  3. 比较最后一个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中
  1. 计算整个bitmap的长度为多少个WORD(lim),剩余的位数left, 计算公式bits = lim * BITS_PER_LONG + left
  2. 计算右移的WORD数off,和剩余的位数(rem) ,计算公式shift = off * BITS_PER_LONG + rem
  3. 右移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
  4. 把右移后,左边的相应的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.

  1. 计算整个bitmap的长度为多少个WORD(lim),剩余的位数left, 计算公式bits = lim * BITS_PER_LONG + left
  2. 计算右移的WORD数off,和剩余的位数(rem) ,计算公式shift = off * BITS_PER_LONG + rem
  3. 左移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
  4. 左移后的最后剩余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的个数
  1. 汉明权重 Hammingcode是指一个字串中非0符号的个数(TheHamming weight of a stringis
    the number of symbols that are different from the zero-symbol ofthealphabetused.)
    应用到2进制符号序列中来,即二进制串中1的个数就是该串的Hammingcode.

猜你喜欢

转载自blog.csdn.net/jwc2436/article/details/80597398