5

私はstd::bitset<N>自分のプログラムで使用していて、最下位のセットビットを見つける必要があり、以下のように簡単な計算を行いました。

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

その後、の最下位ビットnumが設定されres、残りはすべて0'sになります。これ-5は、2の補数表記で表されるように機能します。

しかし、基礎となるビットの2の補数を与えるstd::bitset<N>単項演算子のオーバーロードがないことがわかりました。operator -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

2 の補数を計算するための非常に便利な方法は、ビットセットで最下位の 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 に答える