是否有一种简单的方法来获得std :: bitset <N>的2的补码

vvn*_*man 5 c++ bit-manipulation bitwise-operators bitset

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

int num = 5;
int res = num & (-num);
Run Code Online (Sandbox Code Playgroud)

在此之后,最低位num被设置res并且休息全部都是0.这可以-5用2的补码表示法表示.

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

Zet*_*eta 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想没有比这更微不足道的了;)。

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

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