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

5

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

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

在此之后,将在res中设置num的最低有效位,并将其余位全部设为0。这是因为-5是以二进制补码表示的。
但我发现std::bitset<N>没有任何一元运算符operator -的重载,它可以为基础位提供2的补码。有没有一种简单的方法来使用std::bitset<N>实现2的补码?我总是可以使用operator ~来翻转位并循环遍历它们,从LSB到MSB进行加法和进位,但我正在寻找一种避免这种情况的解决方案。

2
当然,几乎任何事情都有很多非平凡的做法! - rodrigo
我注意到应该使用 trivial :-p 将编辑标题。 - vvnraman
2
请注意,翻转位集上的循环最有可能是与按顺序循环原始位集以查找最低有效位一样快(在这种情况下,我认为这是微不足道的解决方案;) - Zeta
@Zeta 当然,我怎么没想到!!也许这就是我最终要做的。 - vvnraman
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


抱歉索引混乱,我在考虑使用to_string()(“生成的字符串包含N个字符,第一个字符对应于最后(第N-1位)位,最后一个字符对应于第一位。”),而不是使用简单的位逻辑 >.< - Zeta

1
这应该可以做到,除非我漏掉了什么。

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


(Note: 该代码片段是C++代码)

然而,我猜这只适用于N <= 64。 - ferdymercury

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;

1
没有运算符-运算符+,因此有些不便 :-) - vvnraman
不要忘记处理全为1的情况。 - assem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接