考虑我有一个100101
长度为 6 的数字。我希望从位置 2 到 5 翻转位,所以我的答案是111011
. 我知道我可以在一个循环中翻转单个位。但是有没有一种有效的方法可以在没有 for 循环的情况下做到这一点?
问问题
110 次
2 回答
2
如果我理解正确,请尝试
namespace {
unsigned flip(unsigned a)
{
return a ^ 0b011110u;
}
} // namespace
只需将常数调整为您想要翻转的实际位,方法是将它们设置为常数中的 1。
另一方面,如果您只需要更新单个变量,您还可以使用
unsigned value = 0b100101u;
value ^= 0b011110u;
assert(value == 0b111011u);
编辑
这里使用std::bitset<6u>
和 C++98 相同:
#include <bitset>
#include <cassert>
int main()
{
std::bitset<6u> const kFlipBit2to6WithXor(0x1Eu); // aka 0b011110u
std::bitset<6u> number(0x25u); // aka 0b100101u
number ^= kFlipBit2to6WithXor;
assert(number.to_ulong() == 0x3Bu); // aka 0b111011u
return 0;
}
于 2021-01-03T20:25:04.677 回答
1
0b1111
是0b10000
- 1
。
constexpr unsigned low_mask(unsigned x){
return (1u<<x)-1;
}
0b1100
是0b1111
- 0b11
。
constexpr unsigned mask(unsigned width, unsigned offset){
return low_mask(width+offset)-low_mask(offset);
}
然后使用 xor 翻转位。
unsigned result = 0b100001 ^ mask(4,2);
于 2021-01-03T20:25:34.983 回答