5

std::bitset<N>在我的程序中使用,需要找到最不重要的设置位,并进行了如下简单的计算:

int num = 5;
int res = num & (-num);

之后设置最低有效位,num其余res均为0's。这可以-5用 2 的补码表示法表示。

但是我发现std::bitset<N>一元没有任何运算符重载,operator -这会给我底层位的 2 补码。有没有一种简单的方法来实现 2 的补码std::bitset<N>?我总是可以operator ~用来翻转比特并循环它们,从 LSB 到 MSB 进行求和和进位,但我正在寻找一种可以避免这种情况的解决方案。

4

3 回答 3

2

std::bitset不提供任何补充方法。由于您必须自己计算补码operator~和一个额外的循环,因此只需跳过operator~()并直接搜索 LSB:

template <int N>
size_t least_significant_bit(const std::bitset<N> &bt){
    for(size_t i = 0; i < bt.size(); ++i){
        if(bt.test(i))
            return i;
    }
}

我想它不能比这更微不足道了;)。

请注意,least_significant_bit如果根本没有位,则未指定结果。可以返回N或更改循环以测试bt.test(N)哪个会引发异常,但毕竟在空位集中查找 LSB 并没有真正意义。

进一步注意,如果您对边界检查不感兴趣,可以使用std::bitset<N>::operator[]而不是。std::bitset<N>::test

于 2013-03-10T10:39:23.530 回答
1

除非我遗漏了什么,否则应该这样做

std::bitset<N> twos_comp = std::bitset<N>((~input).to_ulong() + 1);

于 2019-03-06T02:48:21.103 回答
0

进行二进制补码的一种非常方便的方法是在您的位集中找到最低有效位 0,将其设置为 1 并将所有较低有效位设置为 0。

伪代码:(假设set[0]是最低有效位,如果不是,转过来)

int i = 0;
while (i < set.length && set[i])
  {
     set[i] = 0;
     ++i;
  }

if (i < set.length)
  set[i] = 1;
于 2013-03-10T09:59:44.323 回答