范围内的位操作
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 语言的操作吗?如果想让x
和y
是变量,可以建两个掩码:
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));
}
虽然我知道在特定位置 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 语言的操作吗?如果想让x
和y
是变量,可以建两个掩码:
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));
}