c ++将整数转换为bool数组的算法

时间:2012-04-04 14:58:34

标签: c++

我正在尝试编写一个算法,该算法将保存为文件作为二进制字符串,每个整数都在一个范围内。例如,对于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 个答案:

答案 0 :(得分: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";
}

答案 1 :(得分: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

请注意,此算法采用的数字顺序与您要打印的数字相反。

答案 2 :(得分: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;
}

答案 3 :(得分:-1)

我想,在这种情况下,问题相当于将小数转换为二进制。 作为解决方案,也可以应用基本算术方法。而且似乎你 开始实施这种方法。

但是这种方法不能仅使用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] << " ";
    }