Comment créer un tableau avec toutes les combinaisons de 0 et 1


15

Dans Excel, je dois générer un tableau avec toutes les combinaisons de 1 et 0 pour 12 espaces.

1 1 1 1 1 1 1 1 1 1 1 1

0 1 1 1 1 1 1 1 1 1 1 1

0 0 1 1 1 1 1 1 1 1 1 1

0 0 0 1 1 1 1 1 1 1 1 1

et ainsi de suite et ainsi de suite, obtenir toutes les combinaisons telles que

0 1 0 1 0 1 0 1 0 1 0 1

Comment puis-je faire ceci?


quelle version d'Excel utilisez-vous?
Máté Juhász


1
Il peut diviser le nombre binaire en une partie d'ordre élevé et une partie d'ordre inférieur, puis utiliser Concaténer pour assembler les deux parties.
Je dis Reinstate Monica

8
D'après votre représentation de la sortie souhaitée, dois-je considérer que chaque chiffre doit être dans une cellule séparée et non dans une chaîne?
Baldrickk

4
Pour référence future, la façon de remercier les gens sur Stack Exchange est d'utiliser ce bouton ▲. Pour la réponse qui a fonctionné pour vous (et a donné le bon résultat), utilisez ce bouton ✔. Si plusieurs réponses fonctionnent, choisissez celle que vous préférez.
wizzwizz4

Réponses:


27

Parce que 2 ^ 12 = 4096, vous avez besoin de 4096 cellules (12 pour vos 12 bits).

En principe, vous mettez dans A1 à A4096 cette commande:

=Right("00000000000" & Dec2Bin(Row()-1),12)

Ce serait ça, mais cela ne fonctionne que pour 0 ... 511 (9 bits). Nous appliquons donc une astuce: nous divisons le nombre en une partie de 3 bits et une partie de 9 bits et calculons les deux chaînes séparément, puis les concaténons.

Vous avez donc:

=RIGHT("00" & DEC2BIN((ROW()-1)/512),3) & RIGHT("00000000" & DEC2BIN(MOD((ROW()-1),512)),9)

Edit: je n'étais pas au courant de l'argument optionnel du nombre de chiffres. Son utilisation donnera cette fonction:

=DEC2BIN((ROW()-1)/512,3) & DEC2BIN(MOD((ROW()-1),512),9)

Mettez-le dans les cellules A1 à A4096.

Edit 2: Selon le commentaire de Lưu Vĩnh Phúc, il est possible que l'OP ait voulu 12 colonnes avec un chiffre binaire chacune. Dans ce cas, mettez

=MID( DEC2BIN((ROW()-1)/512,3) & DEC2BIN(MOD((ROW()-1),512),9) ,COL(),1)

dans toutes les cellules A1 à L 4096.


23

Copiez-collez simplement la formule suivante à l'intérieur A1:

=MOD(QUOTIENT(ROW()-1,2^(COLUMN()-1)),2)

Faites ensuite glisser-remplir vers L4096.

Capture d'écran

La formule extrait le nième bit d'un nombre (n> = 0): le nombre est un entier divisé par 2 ^ n, puis calcule le module 2.


9

Saisissez d'abord la fonction définie par l'utilisateur suivante dans un module standard:

Public Function BigBinary(r As Range) As String
    Dim addy As String, s1 As String, s2 As String

    addy = r.Address(0, 0)
    s1 = "=DEC2BIN(INT(A1/2^27),9)&DEC2BIN(INT(MOD(A1,2^27)/2^18),9)&DEC2BIN(INT(MOD(A1,2^18)/2^9),9)&DEC2BIN(MOD(A1,2^9),9)"
    s1 = Replace(s1, "A1", addy)
    s = Evaluate(s1)
    BigBinary = s
End Function

Cela renvoie une chaîne de 36 "bits". Puis dans A1 entrez:

=ROW()-1

et copier à travers A4096

Dans B1 entrez:

=RIGHT(bigbinary(A1),12)

et copiez-le via B4096 :

démo

Les fonctions définies par l'utilisateur (UDF) sont très faciles à installer et à utiliser:

  1. Alt-F11 ouvre la fenêtre VBE
  2. Alt-I , Alt- Mouvre un nouveau module
  3. collez le contenu et fermez la fenêtre VBE

Si vous enregistrez le classeur, l'UDF sera enregistré avec. Si vous utilisez une version d'Excel postérieure à 2003, vous devez enregistrer le fichier sous .xlsm plutôt que .xlsx

Pour supprimer l'UDF:

  1. afficher la fenêtre VBE comme ci-dessus
  2. effacer le code
  3. fermez la fenêtre VBE

Pour utiliser l'UDF à partir d'Excel:

=myfunction(A1)

Pour en savoir plus sur les macros en général, voir:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

et

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

et pour plus de détails sur les FDU, voir:

http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

Les macros doivent être activées pour que cela fonctionne!


On pourrait sûrement simplement utiliser =RIGHT(bigbinary(ROW()-1),12)?
wizzwizz4

@ wizzwizz4 Vous avez raison ... avec une légère modification de l' UDF ()
Gary's Student

Je viens de lire la macro et j'ai remarqué que c'est exagéré - vous pouvez simplement coller la formule directement dans la boîte, puis utiliser la fonctionnalité de clic / glisser d'Excel pour modifier toutes les références de cellule ou - mieux encore, il suffit d'utiliser à la ROW() - 1place d'une cellule référence. Dans un fichier avec des macros, c'est bien, mais dans un fichier sans, il crée une fenêtre contextuelle irritante et effrayante.
wizzwizz4

1
@ wizzwizz4 J'ai utilisé cet UDF () parce que je l'avais déjà dans ma boîte à outils VBA
Gary's Student

3

Une autre façon que j'ai utilisée:

  • Remplissez de A1àL1 avec des zéros
  • En A2écriture=1-A1
  • En B2écriture=IF( AND( A1=1, A2=0), 1-B1, B1)
  • Copier la B2formule dansC2:L2
  • Copier des A2:L2formules de ligne dans des lignes3:4096

Cela produit toutes les chaînes binaires dans l'ordre, avec les bits les moins significatifs sur la première colonne. La dernière ligne (4096) est tout entière.

Cela ne dépend pas ROW()(donc il peut être déplacé librement), vous pouvez augmenter directement la longueur, et il est simple de généraliser aux chaînes non binaires. Il fonctionne également avec LibreOffice Calc.


3

Mettez la formule suivante dans chaque cellule de A à L, pour toutes les lignes de 1 à 4096

=IF(MOD(ROW() - 1, 2^(13 - COLUMN())) < 2^(12 - COLUMN()), 0, 1)

Si vous voulez le tout dans une chaîne avec des espaces comme ce que vous avez demandé, mettez cela dans la dernière colonne

=A1 & " " & B1 & " " & C1 & " " & D1 & " " & E1 & " " & F1 & " " & G1 & " " & H1 & " " & I1 & " " & J1 & " " & K1 & " " & L1

Faites ensuite glisser les rangées jusqu'au M4096

Pour une solution plus générale, mettez le nombre de bits dans une cellule, comme Z1, ou une cellule nommée comme NumOfBitset utilisez la formule suivante

=IF(MOD(ROW() - 1, 2^(NumOfBits + 1 - COLUMN())) < 2^(NumOfBits - COLUMN()), 0, 1)

Il peut également être facilement modifié pour utiliser n'importe quelle cellule comme cellule de départ en modifiant le décalage de ligne et de colonne

Version optimisée utilisant des opérations au niveau du bit au lieu des pouvoirs:

=IF(BITAND(ROW() - 1, BITLSHIFT(1, 13 - COLUMN()) - 1) < BITLSHIFT(1, 12 - COLUMN()), 0, 1)

=IF(BITAND(ROW() - 1, BITLSHIFT(1, NumOfBits + 1 - COLUMN()) - 1) < BITLSHIFT(1, NumOfBits - COLUMN()), 0, 1)

La façon la plus rapide:

  • Copiez l'une des formules ci-dessus
  • Appuyez sur F5(ou Ctrl+G ) et entrez A1: L4096 pour sélectionner toute la plage
  • Appuyez F2ensuite sur Ctrl+V pour coller
  • Appuyez sur Ctrl+ Shift+ Enter. Boom. Vous avez terminé. Pas besoin de traîner

C'est une formule matricielle qui est beaucoup plus rapide à calculer et à produire un fichier beaucoup plus petit


Explication:

Si nous écrivons toutes les représentations binaires dans des lignes de haut en bas, le cycle de basculement / basculement du nième bit (en comptant à partir du lsb) est de 2 n . Dans chaque cycle, la première moitié (de 0 à 2 n-1 -1) sera 0 et la dernière moitié sera 1. Par exemple, le lsb (premier bit de droite) alternera tous les 2 1-1 = 1 bit, le deuxième bit bascule tous les 2 2-1 = 2 bits ...

En conséquence, nous prendrons modulo 2 n pour obtenir la position actuelle du nombre dans le cycle, s'il est inférieur à 2 n-1, c'est un bit zéro, sinon c'est un.


1

Puisque ce que vous recherchez est chaque nombre binaire à 12 chiffres, votre meilleur pari est d'utiliser la fonction "DEC2BIN" sur chaque nombre de 0 à 4095 (2 ^ 12-1). Malheureusement, DEC2BIN ne fonctionne que jusqu'à 8 chiffres, donc la formule finale semble un peu délicate à cause de la concaténation:

 =DEC2BIN(ROUNDDOWN(A1/256,0),4)&DEC2BIN(A1-256*ROUNDDOWN(A1/256,0), 8)

DEC2BIN prend le nombre à convertir et le nombre de chiffres que vous souhaitez sortir. J'ai combiné 4 et 8 pour obtenir 12. Pour décaler les 4 premiers chiffres jusqu'à la valeur la plus élevée, je les divise par 256 (2 ^ 8) et arrondis pour ignorer les autres chiffres de valeur inférieure. Pour les chiffres de valeur inférieure, soustrayez cette valeur afin qu'ils continuent à compter au-delà de 255.

Recherchez la conversion décimale en binaire et le décalage binaire pour comprendre comment cela fonctionne.


1
Beau travail "jouer au golf" (créer un texte plus court) par rapport à la réponse de @Herb, bien qu'il semble que vous codiez en dur A1 où il utilise une ligne plus flexible (). Pourquoi dit-il que cela fonctionne jusqu'à 511 mais vous dites 255. Est-ce que l'un d'entre vous est éteint ou est-ce une différence dans les différentes versions d'Excel?
TOOGAM

au lieu de ROUNDDOWN(A1/256,0)vous pouvez simplement utiliser QUOTIENT(A1, 256), ou mieux encore BITRSHIFT(A1, 8). Cette dernière partie peut également être remplacée par BITANDouMOD
phuclv

-1

Une réponse qui crée les données en dehors d'Excel, mais crée un .csv qui peut être ouvert pour obtenir la table dans Excel.

Cela utilise python, mais pourrait aussi être fait dans un langage shell. Il suffit de l'exécuter dans cmd.exe si python est installé.

python -c "for i in range(0,2**12): print (','.join((j for j in '{:b}'.format(i).zfill(12))))" > binary.csv

Cela crée un fichier (binary.csv) qui contient le contenu souhaité, chaque chiffre dans des cellules séparées comme (je pense) est souhaité à partir de la question.

explication:

python -c                    < call python passing in a string for the program to run
for i in range(0,2**12):     < for each value from 0 to 12 bits
print (                      < print...
','.join(                    < comma separated...
(j for j in                  < each character from...
'{:b}'.format(i)             < binary representation of current value
.zfill(12))))"               < padded with '0' to length 12
> binary.csv                 < and output to 'binary.csv'

4
Je ne suis pas l'électeur, mais "Dans Excel, je dois générer ...". Ce n'est pas excellent. L'importation d'un fichier CSV et la copie des cellules au bon endroit chaque fois que vous souhaitez le modifier (par exemple plus / moins de lignes) serait pénible.
Tom Carpenter

C'est pour Python <3 mais> = 2.3. Pour une compatibilité ascendante, veuillez ajouter des crochets afin que le printmot-clé soit appelé comme une fonction - de cette façon, il sera compatible avec Python 2.3+ et Python 3.0.0+
wizzwizz4
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.