有没有一种简单的方法来获取 std::bitset <N>的 2 补码

Is there a trivial way to get the 2's complement of an std::bitset<N>

本文关键字:bitset 补码 gt std lt 获取 一种 方法 简单 有没有      更新时间:2023-10-16

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

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

之后,最低有效位num设置为res,其余部分都0。这就像-5用 2 的补码表示法表示一样工作。

但我发现std::bitset<N>对一元operator -没有任何运算符重载,这将为我提供底层位的 2 补充。有没有一种简单的方法可以用std::bitset<N>实现 2 的补码?我总是可以使用operator ~来翻转位并在它们上循环,从 LSB 到 MSB 开始求和和携带,但我正在寻找一种可以避免这种情况的解决方案。

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

除非我错过了什么,否则应该这样做

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

执行二进制补码的一种非常方便的方法是在位集中找到最不重要的 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;