【问题标题】:Truth table input generation真值表输入生成
【发布时间】:2010-11-19 01:09:12
【问题描述】:

对于给定的 n 个输入,我需要使用 C++ 生成所有可能的输入组合

eg. n =4

I need to get,

1010101010101010

1100110011001100

1111000011110000

1111111100000000

(编辑:如果不清楚,这些是按列读取的输入组合)

我需要这些来执行 & 和 | 之类的操作因此,最好将它们的整数表示形式作为 n 个不同的变量。

我尝试使用 bitset 来处理 32 个输入组合,但处理时间很长。我希望你们对更好的实现有什么想法?

EDIT : Example when n=3

10101010

11001100

11110000

【问题讨论】:

  • 你的问题没有意义。生成组合是一回事,生成你展示的四个位模式是另一回事。
  • 想一想……如果你有 32 个输入组合,你就有 (2^32)-1 位模式。那是40亿。是的,这取决于你如何计算它需要一段时间。
  • @Steinbach,我希望这些组合按列阅读。
  • @Jonathan,是的,这就是我寻找替代解决方案的原因。
  • @Adam 你能举个例子,n 是 3 还是 5?

标签: c++ binary combinations binary-data


【解决方案1】:

你的问题我还是完全无法理解。

但是,下面的代码重现了您的示例输出。

#include <iostream>

int main()
{
    using namespace std;

    int const   n       = 3;
    int const   nBits   = 1 << n;

    int powerOf2  = 1;
    for( int i = 0;  i < n;  ++i )
    {
        for( int bitNum = 0;  bitNum < nBits;  ++bitNum )
        {
            cout << 1 - bitNum/powerOf2 % 2;
        }
        cout << endl;
        powerOf2 *= 2;
    }
}

现在我希望这不是家庭作业。如果是这样,那么您通过在 SO 上寻求答案来欺骗自己和他人(稍后会咬到您和其他人)。对于作业,请明确指出是作业,然后我们可以相应地调整答案。

干杯,

【讨论】:

  • 谢谢。但我想出了一个使用左移和掩码的解决方案。不过你的代码肯定比我的快。
【解决方案2】:

这是一个生成该输出的简短实现:

void print_mask(int n){
    for (int level = 0; level < n; level++){
        for (int i = (1<<n)-1; i>=0; i--)   // we'll always output 2**n bits
            printf("%d", (i >> level) & 1);
        printf("\n");
    };
};

【讨论】:

  • @Adam:我想知道你为什么接受这里不完整的代码作为你问题的答案,而不接受我之前给出的等效但完整的代码?
  • 我都跑了,而且都以同样的方式工作。但这更通用。
【解决方案3】:

n=4 会是

0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

不是你生成的(不确定你所说的“n”是什么意思)???

【讨论】:

  • 是的,这是组合,但我希望它按列排列,而不是像您提到的那样按行排列
【解决方案4】:

您的问题没有多大意义,但希望这有点符合您的要求:

#include <stdio.h>

main(){

        int n = 3;
        int total = (n*n)-1;
        char poss[total];
        int i = 0;
        for (i = 0; i < total; ++i){
                poss[i] = i;
                printf("%d \t",poss[i]);
                printf("%d \n",poss[i] & 1);
        }

}

所以 n 是你所说的 n,total 是可以在 n (3) 位中保存的可能性总数。然后设置一个 char 数组,如果它太短,您可以使用 int 。所有可能的都被添加了。这是因为真值表的可能性与那些位中的可能性相同。

第二个 printf 显示了一个 AND 操作,我们将在这里执行例如:

000 AND 001 => 000
001 AND 001 => 001
010 AND 001 => 000
011 AND 001 => 001

查看 Alfs 代码以按照您想要的方式进行格式化(尤其是二进制而不是像这样的十进制)

【讨论】:

    猜你喜欢
    • 2011-03-31
    • 2016-03-22
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    相关资源
    最近更新 更多