2010-11-19 31 views
0

Pour les entrées n données, je dois générer toutes les combinaisons d'entrée possibles en utilisant C++génération d'entrée de table Vérité

eg. n =4 

I need to get, 

1010101010101010 

1100110011001100 

1111000011110000 

1111111100000000 

(EDIT: Au cas où ce n'est pas clair, ce sont les combinaisons d'entrée en lecture sage colonne)

J'ai besoin de ceux-ci pour effectuer des opérations comme & et | il serait donc préférable que je les obtienne dans leur représentation entière comme n variables différentes.

J'ai essayé de le faire en utilisant bitset pour 32 combinaisons d'entrée, mais il a fallu beaucoup de temps pour traiter. J'espérais que vous aviez des idées sur une meilleure implémentation?

EDIT : Example when n=3 

10101010 

11001100 

11110000 
+1

votre question n'a aucun sens. Générer des combinaisons est une chose, générer les quatre bittaps que vous montrez est une autre chose. –

+0

Pensez-y ... si vous avez 32 combinaisons d'entrée, vous avez (2^32) -1 bits. C'est 4 milliards. Oui, selon la façon dont vous le calculez, ça va prendre du temps. –

+0

@ Steinbach, je veux que les combinaisons lues colonne sage. –

Répondre

1

Voici une implémentation courte qui génère cette sortie:

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"); 
    }; 
}; 
+0

Merci beaucoup pour votre temps! –

+1

@Adam: Je me demande pourquoi vous avez accepté le code incomplet ici comme une réponse à votre question, tout en n'acceptant pas le code équivalent mais complet que j'ai donné plus tôt? –

+0

J'ai couru les deux et les deux ont fonctionné de la même manière. Mais c'était plus générique. –

1

n = 4 serait

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

pas ce que vous avez généré (pas sûr de ce que vous entendez par "n") ???

+0

Oui c'est la combinaison mais je le veux en colonne sage, pas en rang sage comme vous avez mentionné dhere –

4

Votre question est tout à fait incompréhensible pour moi.

Le code ci-dessous reproduit cependant votre exemple de sortie.

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

Maintenant, j'espère que ce n'était pas des devoirs. Si c'était le cas, vous vous trompez vous-même et les autres en cherchant des réponses sur SO (qui va vous mordre, et d'autres, plus tard). Pour les devoirs, s'il vous plaît indiquer clairement que c'est devoirs, alors nous pouvons ajuster nos réponses en conséquence.

Vive & HTH,

+0

Merci pour cela.Mais j'ai trouvé une solution dans le même sens en utilisant des décalages à gauche et des masques. Votre code est définitivement plus rapide que le mien. –

0

Votre question ne fait pas beaucoup de sens, mais nous espérons que cela est un peu à ce que vous cherchez.

#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); 
     } 

} 

Alors n est votre n comme vous le dites, au total est le nombre total de possibilités pouvant être détenues en n (3) bits. Ensuite, un tableau char est configuré, vous pouvez utiliser int si c'est trop court. Tous les possibles sont ajoutés. C'est parce que les possibilités de tables de vérité sont les mêmes que celles de ce qui peut être dans ces nombreux bits.

La deuxième printf montre une opération ET, ici nous rendrions par exemple:

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

Voir le code Alfs pour le formatage de la manière que vous voulez (en particulier en binaire non en décimal comme celui-ci)