范围内的位操作

Bit manipulation in a range

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

101011011011

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

Bit set: 101011111111
Bit unset: 101010000011

掩码必须动态推送,因为 x 和 y 显然是随机的。
感谢您的帮助。

待跟进 设置从 3 到 7:

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

清除

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

在上面使用 C 风格 |是or,&是and,~是恭维。

我们是在谈论类 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.

如果你像往常一样从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));
}