2013-03-10 4 views
5

::があり、以下のように些細な計算をした:は、STDの2の補数を取得するための些細な方法は、私は私のプログラムで<code>std::bitset<N></code>を使用して、最下位セットビットを見つけるために必要だったビットセット<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までのキャリーを実行することができましたが、私はこれを回避する解決策を探していました。

+2

確かに、ほとんど何もすることの**非自明**の方法があります! – rodrigo

+0

私は__trivial__を使っていたはずです:-pタイトルを編集します。 – vvnraman

+2

フリップされたビットセットをループすることは、最下位ビットを見つけるために元のビットセットを単にループさせることと同じくらい速くなる可能性が高いことに注意してください(この場合、私は些細な解決策を見つけることができます。) – Zeta

答えて

2

std::bitsetは、任意の補完方法を提供していません。あなたは、単にoperator~()をスキップし、LSB直接の検索、operator~および追加のループを自分で補完計算しなければならないので:

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>::testの代わりにstd::bitset<N>::operator[]を使用できます。

+0

インデックスの混乱のため申し訳ありません、私は['to_string()'](http://en.cppreference.com/w/cpp/utility/bitset/to_string)(* "結果の文字列にはN最初の文字を含む文字は、単純なビット論理を使用する代わりに、最後(N-1番目)のビットと最初のビットに対応する最後の文字 "*"に対応します。<< – Zeta

0

2の補数を行うために非常に便利な方法は、あなたのビットセットで最下位の0を見つける1と0の

擬似コードに、すべての下位ビットを設定することに設定されています(そのセットを想定したが[0]であります最下位ビット、そうでない場合は、それを好転させる)

int i = 0; 
while (i < set.length && set[i]) 
    { 
    set[i] = 0; 
    ++i; 
    } 

if (i < set.length) 
    set[i] = 1; 
+1

'operator -'や' operator + 'はありません。したがって、不便です:-) – vvnraman

+0

あなたは正しいです。私は私の答えを更新しました。 –

+0

すべてを処理することを忘れないでください – assem

関連する問題

 関連する問題