2011-12-10 11 views
3

私は面白い小さな問題を抱えています、そして、私は猫を肌に塗る複数の方法があることを知っていますが、私は最高/最も効率的な方法は何だろうと思っていました。ビットからなるブール値の配列への整数、C++で最も効率的な方法ですか?

セイ例えばI値534、現在16個のブール

を格納することができる配列を有する整数を有する、バイナリの534は534から

を取得するための最良の方法であろう方法10000010110

あります

array[0] = 0 
array[1] = 1 
array[2] = 1 
array[3] = 0 
array[4] = 1 
.... 
array[15] = 0 

ありがとうございます!

+0

はまた、このチェックアウト:http://stackoverflow.com/questions/4156538/how-can-stdbitset-be-faster-than-stdvectorbool – FailedDev

答えて

12

使用std::bitset<16>と個々のビットにアクセスするためにoperator[]を呼び出します。

#include <iostream> 
#include <bitset> 

int main() 
{ 
    std::bitset<16> bits(534); 
    std::cout << bits << std::endl; 

    //use operator[] to access individual bits 
    std::cout << bits[2] << std::endl; 
} 

出力(demo):

0000001000010110 
1 

をあなたは安全を考える場合、これは、その後、最も効率的ではないかもしれないが、それは生の配列型に代わるより良い方法です。効率の差はごくわずかです。

コンパイル時にビット数がわかっておらず、実行時にビット数がわかれば、boost::dynamic_bitsetが役に立ちます。 dynamic_bitsetクラスはビットのセットを表し、そのdocから

:それを見ています。演算子[]を介して個々のビットの値へのアクセスを提供し、演算子&と演算子< <など、組み込み整数に適用できるすべてのビット演算子を提供します。セット内のビット数は、実行時にdynamic_bitsetのコンストラクタへのパラメータを介して指定されます。

dynamic_bitsetクラスは、std :: bitsetクラスとほぼ同じです。違いは、dynamic_bitsetのサイズ(ビット数)は、dynamic_bitsetオブジェクトの構築中に実行時に指定されますが、std :: bitsetのサイズは整数テンプレートパラメータによってコンパイル時に指定されます。このよう

+0

それはまさに私です必要!ありがとう – zeta

2

for (unsigned int i = 0; i != 16; ++i) 
{ 
    array[i] = n & 1; 
    n /= 2; 
} 
+0

私はそれが効率的なhellaだと思います。 – RandomInsano

関連する問題