C++ 有没有一种简单的方法来获得2';std::位集的s补码<;N>;

C++ 有没有一种简单的方法来获得2';std::位集的s补码<;N>;,c++,bit-manipulation,bitwise-operators,bitset,C++,Bit Manipulation,Bitwise Operators,Bitset,我在我的程序中使用了std::bitset,需要找到最低有效集位,并进行了如下简单计算: int num = 5; int res = num & (-num); 之后,在res中设置num的最低有效位,其余均为0。这是因为-5用2的补码表示法表示 但是我发现std::bitset对于一元运算符-没有任何运算符重载,这将为基础位提供2的补码。有没有一种简单的方法可以用std::bitset实现2的补码?我总是可以使用运算符~来翻转位并循环它们,从LSB到MSB进行和进位运算,但我一直在

我在我的程序中使用了
std::bitset
,需要找到最低有效集位,并进行了如下简单计算:

int num = 5;
int res = num & (-num);
之后,在
res
中设置
num
的最低有效位,其余均为
0
。这是因为
-5
用2的补码表示法表示


但是我发现
std::bitset
对于一元
运算符-
没有任何运算符重载,这将为基础位提供2的补码。有没有一种简单的方法可以用
std::bitset
实现2的补码?我总是可以使用
运算符~
来翻转位并循环它们,从LSB到MSB进行和进位运算,但我一直在寻找一种解决方案来避免这种情况。

进行两位补码的一种非常方便的方法是在位集中找到最不重要的0,将其设置为1,并将所有低有效位设置为0

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

inti=0;
而(i
std::bitset
不提供任何补充方法。由于您必须使用
运算符
和一个附加循环自己计算补码,只需跳过
运算符~()
,直接搜索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;
    }
}
模板
最小有效位大小(常量标准::位集和bt){
对于(大小i=0;i
我想再也没有比这更琐碎的了

请注意,如果根本没有位,则不会指定
最低有效位的结果。可以返回
N
或更改循环以测试
bt.test(N)
,这将引发异常,但毕竟在空位集中查找LSB是没有意义的


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

这应该可以做到,除非我遗漏了什么


std::bitset twos\u comp=std::bitset(~input).to_ulong()+1)

没有
操作符-
操作符+
,因此带来不便:-)不要忘记处理“全一”的情况当然,做任何事情都有很多非琐碎的方法!我注意到我应该使用平凡:-p来编辑标题。请注意,在翻转的位集上循环最有可能像在原始位集上循环一样快,以便找到最低有效位(我在本例中找到了平凡的解决方案;)@Zeta当然,为什么我没有想到它!!这可能就是我最后要做的。很抱歉索引混乱,我考虑的是(“结果字符串包含N个字符,第一个字符对应于最后(N-1)位,最后一个字符对应于第一位。”),而不是使用简单的位逻辑>。
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;
    }
}