虽然我知道在特定位置设置/取消位的过程 - 在一个范围内(例如从位置x到y)执行此操作的最有效方法是什么?
101011011011
n=12
x=3,y=7(from right)
Bit set: 101011111111
Bit unset: 101010000011
必须动态推动面具,因为x和y显然是随机的 谢谢你的帮助。
答案 0 :(得分:1)
我们在谈论类似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
的位。
答案 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));
}