0

範囲内のすべての整数をバイナリ文字列としてファイルに保存するアルゴリズムをコーディングしようとしています。たとえば、範囲 0 から 7 の場合:

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 []s (または別の方法) で表される 2 進数に変換することです。

編集

要求どおり、これまでの私の解決策は次のとおりです。

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";
}

残念ながら、これは最初のパターンが 000000 ではなく 000001 であるため、少し厄介です。

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

4

3 に答える 3

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";
}
于 2012-04-04T16:13:56.667 に答える
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

このアルゴリズムで使用される桁の順序は、印刷する順序とは逆であることに注意してください。

于 2012-04-04T15:04:05.840 に答える
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;
  }
}

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

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;
}
于 2012-04-04T17:00:02.570 に答える