一个范围内的位操作

时间:2017-03-04 02:30:04

标签: bit-manipulation bit

虽然我知道在特定位置设置/取消位的过程 - 在一个范围内(例如从位置x到y)执行此操作的最有效方法是什么?

101011011011

n=12
x=3,y=7(from right)

Bit set: 101011111111
Bit unset: 101010000011

必须动态推动面具,因为x和y显然是随机的 谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

我们在谈论类似C的操作吗?如果您希望xy是变量,则可以构建两个掩码:

unsigned set(unsigned val, int x, int y) {
  unsigned hi = ~0 << x;    // 1's at position x and higher
  unsigned lo = ~(~0 << y); // 1's at positions lower than y
  return val | (lo & hi);
}

unsigned clear(unsigned val, int x, int y) {
  unsigned hi = ~(~0 << x);   
  unsigned lo = ~0 << y; 
  return val & (lo | hi);
}

请注意,范围的结尾在高端不包含。因此set(foo, 5, 9)设置第5到第8位,其中每个位i都是值为2^i的位。

答案 1 :(得分:0)

跟进 设置从3到7:

value = 1010110...
mask = 0x7C; // 0111 1100 binary
value |= mask;

清除

value = 1010110...
mask = 0x7C; // 0111 1100 binary
value &= ~mask;

使用上面的C风格|是或,&amp;是和,而且是赞美。

答案 2 :(得分:0)

如果您像往常一样从0开始计算位数,则可以使用:

unsigned set(unsigned x, unsigned l, unsigned h) {
    return x | (((1u << h) << 1) - (1u << l));
}

unsigned reset(unsigned x, unsigned l, unsigned h) {
    return x & ~(((1u << h) << 1) - (1u << l));
}