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 表示的二进制数(或一些替代方法)。

编辑

根据要求,到目前为止我的解决方案是:

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

不幸的是,这有点古怪,因为它给我的第一个模式是 000001 而不是 000000。

这不是家庭作业。我只是在编写一个简单的算法来给我一个用于训练神经网络的输入文件。

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 回答