在位集中一次设置多个位

时间:2019-01-28 18:21:11

标签: c++ bit-manipulation bitset

我正在使用玩具文件系统,我正在使用bitset来跟踪已使用和未使用的页面。我正在使用arrayint(以使用GCC的内置位操作)来表示bitset。我没有使用std::bitset,因为它在最终环境(嵌入式系统)上将不可用。

现在,根据Linux perf,在测试过程中,分配文件占用了35%的运行时间,有45%的时间用于设置位,

#define BIT_SET(a,b) ((a) |= (1ULL<<(b)))

在循环内。根据性能,or中有42%的时间丢失。删除要快一些,但是在and操作中使用xor清除位切换位的操作大部分时间都没有浪费。

基本上我想知道是否有更聪明的方法可以一次性设置多个位。如果用户请求10页空间,则只需一次性设置所有位,但问题是空间可能会跨越word个边界。或我应该知道的任何GCC / Clang语法?

1 个答案:

答案 0 :(得分:0)

您应该能够使用这样的函数一次在一个位集中设置多个位:

void set_mask(word_t* bitset, word_t mask, int lowbit) {
  int index= lowbit / sizeof(word_t);
  int offset = lowbit % sizeof(word_t);
  bitset[index] |= (mask << offset);
  mask >>= (sizeof(word_t) - offset);
  bitset[index+1] |= mask
}

如果掩码不跨越边界,则第二个字的ORd为0,因此不变。无条件地执行此操作可能比测试是否需要执行更快。如果测试显示其他情况,请在最后一行之前添加if (mask)