2017-08-27 14 views
2

私は32ビットのビットセットを持っています。私は加算のバイナリメソッドを使用して1を追加したいと思います。だから私はバイナリ形式で、今はバイナリ形式でそれに1を追加したい、それを行うためのデフォルトのメソッドか、それのための関数を作成する必要があります。32ビットのビットセットに1を加えてください

#include<string.h> 
    #include<iostream> 
    #include<bitset> 
    #include<cstlib> 
    int main(){ 
     int a; 
     cin >> hex >> a; 
     bitset<32> binary(a); 
     } 

答えて

2

std::bitsetunsigned longまたはunsigned long longから割り当て可能です。

また、これらのタイプのアクセサもあります。

#include <bitset> 

auto get() -> std::bitset<32>; 
auto put(std::bitset<32>) -> void; 

int main(){ 
    auto bs = get(); 
    bs = bs.to_ulong() + 1; 
    put(bs); 
} 

例のアセンブラ出力:コンパイラは、任意のコピーや変換を行う必要はありませんことを実現するために十分明るいと

main: 
    sub rsp, 8 
    call get() 
    lea edi, [rax+1] 
    call put(std::bitset<32ul>) 
    xor eax, eax 
    add rsp, 8 
    ret 

注意。

2

回答自体は簡単ですが、私は良いコーディングスタイルのアドバイスに貢献します。

表示されているコードでは、std::bitset::to_ulong()を使用して、後ろに変換する前に追加するか、何でもできます。

しかし、あなたのコードにはスタイルの問題が少なく、将来のアーキテクチャでいくつかのロジックを壊す可能性があります。

データ型は、ではありません。は、標準で32ビットであることが保証されています。あなたがコンパイルしているアーキテクチャーは、最も効率的です。

uint32_tはすべてのアーキテクチャで32ビット長であることが保証されています。

そして、std::bitsetはそれが本当にうまくいきません。 intタイプより大きいサイズの場合は効率的ではありません。インデックスを行う必要があり、intタイプのサイズより小さい場合はintタイプよりも効率的ではありません。そして、ビット単位でない演算を行う方法は、longにキャストすることです。ではなく、であることが保証されています。加算は、intの場合より速く、または同じ速度になることが保証されています。

したがって、最も効率的なタイプは、uint32_tで、符号付きタイプのビット演算では未定義の動作を保護しています。

効率的でメインテナンス可能なコードをコーディングしている間は、次のように読むことができます。Why is "using namespace std" considered bad practice?

関連する問題