0

考虑我有一个100101长度为 6 的数字。我希望从位置 2 到 5 翻转位,所以我的答案是111011. 我知道我可以在一个循环中翻转单个位。但是有没有一种有效的方法可以在没有 for 循环的情况下做到这一点?

4

2 回答 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

0b11110b10000- 1

constexpr unsigned low_mask(unsigned x){
  return (1u<<x)-1;
}

0b11000b1111- 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 回答