gpt4 book ai didi

c - 如何理解bitmap_set()?

转载 作者:太空狗 更新时间:2023-10-29 12:15:30 28 4
gpt4 key购买 nike

linux内核中,include/linux/bitmap.h,bitmap_set()函数

void bitmap_set(unsigned long *map, int start, int nr)
{
unsigned long *p = map + BIT_WORD(start);
const int size = start + nr;
int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG);
unsigned long mask_to_set = BITMAP_FIRST_WORD_MASK(start);

while (nr - bits_to_set >= 0) {
*p |= mask_to_set;
nr -= bits_to_set;
bits_to_set = BITS_PER_LONG;
mask_to_set = ~0UL;
p++;
}
if (nr) {
mask_to_set &= BITMAP_LAST_WORD_MASK(size);
*p |= mask_to_set;
}
}

#define BIT_WORD(nr) ((nr) / BITS_PER_LONG)
#define BITS_PER_LONG __WORDSIZE
#ifndef __WORDSIZE
#define __WORDSIZE (__SIZEOF_LONG__ * 8)
#endif
#define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) % BITS_PER_LONG))
#define BITMAP_LAST_WORD_MASK(nbits) \
( \
((nbits) % BITS_PER_LONG) ? \
(1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL \
)

这个函数我看了,还是没看懂。例如:

  1. 我觉得应该是

    bits_to_set = start % BITS_PER_LONG;

    代替

    bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG);
  2. 我觉得应该是size = nr而不是size = start + nr;,因为nr代表的是长度应该设置的区域。

  3. 如何理解BITMAP_LAST_WORD_MASK(nbits)

  4. 如何理解这个功能的设计?

谢谢

最佳答案

int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG);

因此

(start % BITS_PER_LONG) + bits_to_set = BITS_PER_LONG;

从中我们可以看出bits_to_set是缺少的(如果有的话)数字来完成 start当我们将开始分成大小相等的部分时 BITS_PER_LONG .

|0       BITS_PER_LONG,       2*BITS_PER_LONG,       3*BITS_PER_LONG,   start|
| ^^^^^^^^^^
bits_to_set

然后我们正在测试(nr - bits_to_set)查找 nr 是否大于或等于余数的值。如果位不在 bits_to_set 内,那么最后一个词就是我们需要的

if (nr) { 
mask_to_set &= BITMAP_LAST_WORD_MASK(size);
*p |= mask_to_set;
}

否则我们必须遍历其他 BITS_PER_LONG 大小的 map :

while (nr - bits_to_set >= 0) {
*p |= mask_to_set; // 1
nr -= bits_to_set; // 2
bits_to_set = BITS_PER_LONG; // 3
mask_to_set = ~0UL; // 4
p++; // 5
}

第一次运行:1.敷面膜2. 减去提醒 (bits_to_set) 所以 nr 现在是 BITS_PER_LONG 的倍数(如果我们除以它,我们知道有多少个 BITS_PER_LONG 大小的 block )3. 现在 bits_to_set = BITS_PER_LONG 5. 递增指针

接下来的运行:我们正在减去 block 并继续前进

关于c - 如何理解bitmap_set()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26484219/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com