Генерация ввода таблицы истинности - PullRequest
1 голос
/ 19 ноября 2010

Для заданных n входов мне нужно сгенерировать все возможные входные комбинации, используя C ++

eg. n =4

I need to get,

1010101010101010

1100110011001100

1111000011110000

1111111100000000

(РЕДАКТИРОВАТЬ: В случае, если это не ясно, эти комбинации ввода читаются по столбцам)

Они нужны мне для выполнения таких операций, как & и | поэтому было бы лучше, если бы я получил их в целочисленном представлении в виде n различных переменных.

Я попытался сделать это, используя битовый набор для 32 входных комбинаций, но обработка заняла много времени. Я надеялся, что у вас, ребята, есть идеи по лучшей реализации?

EDIT : Example when n=3

10101010

11001100

11110000

Ответы [ 4 ]

4 голосов
/ 19 ноября 2010

Ваш вопрос все еще совершенно непонятен для меня.

Однако приведенный ниже код воспроизводит ваш пример вывода.

#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 (который укусит вас и других позже).Для домашней работы, пожалуйста, четко укажите, что это домашняя работа, тогда мы можем соответствующим образом скорректировать наши ответы.

Cheers & hth.,

2 голосов
/ 19 ноября 2010

Вот короткая реализация, которая генерирует этот вывод:

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");
    };
};
1 голос
/ 19 ноября 2010

n = 4 будет

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

не тем, что вы сгенерировали (не уверен, что вы подразумеваете под "n") ???

0 голосов
/ 19 ноября 2010

Ваш вопрос не имеет особого смысла, но, надеюсь, это в некоторой степени соответствует тому, что вы ищете:

#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) битах.Затем устанавливается массив символов, вы можете использовать int, если он слишком короткий.Все возможные варианты добавлены.Это потому, что возможности таблиц истинности такие же, как у того, что может быть в этих многих битах.

Второй printf показывает операцию AND, здесь мы будем делать, например:

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

См. Код Alfs для форматирования так, как вы хотите (особенно в двоичном, а не в десятичном виде)

...