2012-04-04 15 views
0

範囲内のすべての整数をバイナリ文字列としてファイルに保存するアルゴリズムをコーディングしようとしています。たとえば、0〜7の範囲では、C++整数をboolの配列に変換するアルゴリズム

0 0 0 
0 0 1 
0 1 0 
0 1 1 
1 0 0 
1 0 1 
1 1 0 
1 1 1 

数字の間の先頭のゼロとスペースは必須です。

単純な方法で行う方法を理解できないのは、整数をbool [](または別の方法)で表される2進数に変換することです。要求されたよう

EDIT

、私の解決策は、これまでのところです:それは私を与える第一のパターンは、000001の代わりに000000

あるよう

const int NUM_INPUTS = 6; 
bool digits[NUM_INPUTS] = {0}; 
int NUM_PATTERNS = pow(2, NUM_INPUTS); 

for(int q = 0; q < NUM_PATTERNS; q++) 
{ 
    for(int w = NUM_INPUTS -1 ; w > -1 ; w--) 
    { 

     if(! ((q+1) % ((int) pow(2, w))) ) 
      digits[w] = !digits[w]; 

     outf << digits[w] << " "; 
    } 

    outf << "\n"; 
} 

は残念ながら、これは少しおかしくあり

これは宿題ではありません。私はニューラルネットワークをトレーニングするための入力ファイルを与えるための単純なアルゴリズムをコーディングしています。

+0

は、この宿題です?もしそうなら、そのようにタグを付けてください – Shahbaz

+0

代わりに基本変換をしたいと思います。 Google ** C++ベース2 ** – Blender

+0

バイナリデータはboolの配列と同じではありません...あなた自身のバイナリ表現を作成することになっていますか? – Kiril

答えて

4

powを使用しないでください。

const int NUM_INPUTS = 6; 
int NUM_PATTERNS = 1 << NUM_INPUTS; 

for(int q = 0; q < NUM_PATTERNS; q++) 
{ 
    for(int w = NUM_INPUTS -1 ; w > -1; w--) 
    { 
     outf << ((q>>w) & 1) << " "; 
    } 
    outf << "\n"; 
} 
+0

'1 << 6" = 64はどうですか?私は '<<' or '>>'演算子に慣れていません。 –

+0

'x << n」は、値「x」を「n」ビットだけ左にシフトする。望むなら、 'x'、' n'回の値を2倍にします。 1はバイナリで "0000_0001"です。 1左に6回シフトすると、「0100_0000」となります。同様に、 'x >> n'は' x'を 'n'ビット(または' x'、 'n'回)だけ* right *にシフトします。 http://en.wikipedia.org/wiki/Bitwise_operation#Bit_shifts –

3

注:私は、コードを提供していないんだけど、単にヒント質問は宿題

ように聞こえるので、これは非常に簡単です。代わりに書かれ

number = 23 
binary representation = 10111 
first digit = (number )&1 = 1 
second digit = (number>>1)&1 = 1 
third digit = (number>>2)&1 = 1 
fourth digit = (number>>3)&1 = 1 
fifth digit = (number>>4)&1 = 1 

:このアルゴリズムで撮影した数字の順番は、印刷したいものの逆であることを

temp = number 
for i from 0 to digits_count 
    digit i = temp&1 
    temp >>= 1 

(注)この例を参照してください。

+0

int compare = 1L <<(digits_count - 1);数字i =(temp&compare?1:0); temp << = 1; –

+0

あなたが不思議に思っている場合、それはあなたが望む順序で数字を取ることができます... –

+0

@OrgnlDave、私は不思議ではなかった、それは明らかでした。私はOPにヒントを与えようとしているだけで、彼自身が問題に取り組ませてくれるだろう。 – Shahbaz

-1

この場合、問題は10進数を2進数に変換することと同じです。 解決策として、基本的な算術演算を適用することもできます。そして、あなたは その方法を実装し始めているようです。

しかし、この方法はmod(%)操作だけでは実装できません。また、除算(/) 演算を使用する必要があります。

次のようにこのように、コードは次のようになります。

int s = q; 

    for(int w = NUM_INPUTS -1 ; w > -1 ; w--) 
    { 
     (s/pow(2,w)) ? digits[w] = 1 : digits[w] = 0; 
     s %= pow(2,w); 

     outf << digits[w] << " "; 
    } 
+0

私はdownvoteの理由を聞いてもよろしいですか? – oak

+0

不要な算術の過剰使用。いくつかのビットシフトと比較を持つループははるかに簡単で、より適切で、より明確です –

+0

私は他の方法の容易さに同意します。しかし、低レベルのビット単位の操作を妨げることなく問題にアプローチしたいと思っていました。また、問題の方法は、この算術的方法を実装しようとします。 – oak

1

怠惰な方法は、std :: bitsetを使うことです。

例:

#include <bitset> 
#include <iostream> 

int main() 
{ 
    for (unsigned int i = 0; i != 8; ++i){ 
    std::bitset<3> b(i); 
    std::cout << b << std::endl; 
    } 
} 

あなたが個別に出力するビットをしたい場合は、スペースで区切られた、として定義されWriteで、Write(b)のようなものを呼び出してstd::cout << b << std::endl;を置き換える:

template<std::size_t S> 
void Write(const std::bitset<S>& B) 
{ 
    for (int i = S - 1; i >= 0; --i){ 
    std::cout << std::noboolalpha << B[i] << " "; 
    } 
    std::cout << std::endl; 
} 
+0

std :: bitsetとは何ですか? –

+0

@MattMunson:実際の画面と実際のキーボードで実際のコンピュータにアクセスできるようになったので、例を追加しました。 –

関連する問題