So erstellen Sie eine Tabelle mit allen Kombinationen von 0 und 1

15

In Excel muss ich eine Tabelle mit allen Kombinationen von 1 und 0 für 12 Leerzeichen generieren.

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

und so weiter und so fort, bekommen alle Kombinationen wie

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

Wie kann ich das machen?

Pablo Durbin Sprake Martínez
quelle
Welche Excel-Version verwenden Sie?
Máté Juhász,
support.office.com/en-us/article/…
Ich sage Reinstate Monica
1
Er kann die Binärzahl in einen Teil hoher und einen Teil niedriger Ordnung aufteilen und dann die beiden Teile mithilfe der Verkettung zusammenfügen.
Ich sage Reinstate Monica
8
Soll ich aus Ihrer Darstellung der gewünschten Ausgabe entnehmen, dass sich jede Ziffer in einer separaten Zelle und nicht in einer Zeichenfolge befinden sollte?
Baldrickk
4
Zum späteren Nachschlagen verwenden Sie diese ▲ -Taste, um sich bei den Mitarbeitern von Stack Exchange zu bedanken. Verwenden Sie die Taste ✔, um die Antwort zu finden, die für Sie funktioniert hat (und die das richtige Ergebnis liefert). Wenn mehr als eine Antwort funktioniert, wählen Sie diejenige aus, die Ihnen am besten gefällt.
wizzwizz4

Antworten:

27

Da 2 ^ 12 = 4096 ist, benötigen Sie 4096 Zellen (12 für Ihre 12 Bits).

Im Prinzip geben Sie in A1 bis A4096 den folgenden Befehl ein:

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

Das wäre es, aber es funktioniert nur für 0 ... 511 (9 Bit). Also wenden wir einen Trick an: Wir teilen die Zahl in einen 3-Bit- und einen 9-Bit-Teil auf, berechnen die beiden Zeichenfolgen getrennt und verknüpfen sie dann.

Sie haben also:

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

Bearbeiten: Mir war das optionale Argument für die Anzahl der Ziffern nicht bekannt. Wenn Sie es verwenden, erhalten Sie folgende Funktion:

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

Fügen Sie dies in die Zellen A1 bis A4096 ein.

Edit 2: Laut Lưu Vĩnh Phúcs Kommentar ist es möglich, dass das OP 12 Spalten mit jeweils einer Binärziffer wollte. In diesem Fall setzen

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

in alle Zellen A1 bis L 4096.

Kraut
quelle
23

Kopieren Sie einfach die folgende Formel und fügen Sie sie ein A1:

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

Dann ziehen Sie die Füllung auf L4096.

Bildschirmfoto

Die Formel extrahiert das n-te Bit einer Zahl (n> = 0): Die Zahl ist eine Ganzzahl geteilt durch 2 ^ n. Berechnen Sie dann den Modul 2.

Salman A
quelle
9

Geben Sie zunächst in einem Standardmodul die folgende benutzerdefinierte Funktion ein:

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

Dies gibt eine Zeichenkette von 36 "Bits" zurück. Dann in A1 eingeben:

=ROW()-1

und über A4096 kopieren

In B1 geben Sie ein:

=RIGHT(bigbinary(A1),12)

und über B4096 kopieren :

Demo

Benutzerdefinierte Funktionen (UDFs) sind sehr einfach zu installieren und zu verwenden:

  1. Alt- F11Ruft das VBE-Fenster auf
  2. Alt- I, Alt- Möffnet ein neues Modul
  3. Fügen Sie das Material ein und schließen Sie das VBE-Fenster

Wenn Sie die Arbeitsmappe speichern, wird die UDF mit dieser gespeichert. Wenn Sie eine Excel-Version später als 2003 verwenden, müssen Sie die Datei als .xlsm und nicht als .xlsx speichern

So entfernen Sie die UDF:

  1. Rufen Sie das VBE-Fenster wie oben beschrieben auf
  2. Löschen Sie den Code
  3. Schließen Sie das VBE-Fenster

So verwenden Sie die UDF aus Excel:

=myfunction(A1)

Weitere Informationen zu Makros im Allgemeinen finden Sie unter:

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

und

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

Einzelheiten zu UDFs finden Sie unter:

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

Makros müssen aktiviert sein, damit dies funktioniert!

Garys Schüler
quelle
Könnte man doch einfach gebrauchen =RIGHT(bigbinary(ROW()-1),12)?
wizzwizz4
@ wizzwizz4 Du hast Recht ... mit einer kleinen Änderung an der UDF ()
Garys Schüler
Ich habe gerade das Makro gelesen und festgestellt, dass es zu viel ist - Sie können die Formel einfach direkt in das Feld einfügen und dann mit der Click / Drag-Funktion von Excel alle Zellreferenzen ändern oder - noch besser - einfach ROW() - 1anstelle einer Zelle verwenden Referenz. In einer Datei mit Makros ist dies in Ordnung, aber in einer Datei ohne Makros wird ein irritierendes und unheimlich aussehendes Popup erstellt.
wizzwizz4
1
@ wizzwizz4 Ich habe diese UDF () verwendet, weil ich sie bereits in meiner VBA-Toolbox hatte
Garys Schüler,
3

Ein anderer Weg, den ich benutzt habe:

  • Füllen Sie von A1bis L1mit Nullen
  • In A2schreiben=1-A1
  • In B2schreiben=IF( AND( A1=1, A2=0), 1-B1, B1)
  • B2Formel kopieren nachC2:L2
  • Kopieren Sie A2:L2Zeilenformeln in Zeilen3:4096

Dadurch werden alle Binärzeichenfolgen in der angegebenen Reihenfolge mit niedrigstwertigen Bits in der ersten Spalte erstellt. Letzte Reihe (4096) sind alle.

Dies ist nicht abhängig von ROW()(daher kann es frei verschoben werden), Sie können die Länge direkt erhöhen und es ist einfach, auf nicht-binäre Zeichenfolgen zu verallgemeinern. Es funktioniert auch mit LibreOffice Calc.

Leonbloy
quelle
3

Fügen Sie in jede Zelle von A bis L für alle Zeilen von 1 bis 4096 die folgende Formel ein

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

Wenn Sie das Ganze in einer Zeichenfolge mit Leerzeichen wie dem, was Sie gefragt haben, wollen, setzen Sie dies in die letzte Spalte

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

Ziehen Sie dann die Zeilen bis M4096

Geben Sie für eine allgemeinere Lösung die Anzahl der Bits in eine Zelle wie Z1 oder eine benannte Zelle wie NumOfBitsund verwenden Sie die folgende Formel

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

Sie kann auch einfach geändert werden, um eine beliebige Zelle als Startzelle zu verwenden, indem Sie den Zeilen- und Spaltenversatz ändern

Optimierte Version mit bitweisen Operationen anstelle von Kräften:

=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)

Schnellster Weg:

  • Kopieren Sie eine der obigen Formeln
  • Drücken Sie F5(oder Ctrl+ G) und geben Sie A1: L4096 das gesamte Spektrum wählen
  • Drücken Sie F2dann Ctrl+, Vum einzufügen
  • Drücken Sie Ctrl+ Shift+ Enter. Boom. Sie sind fertig. Sie müssen nicht ziehen

Es ist eine Matrixformel, die viel schneller berechnet und eine viel kleinere Datei erzeugt


Erläuterung:

Wenn wir alle binären Darstellungen in Zeilen von oben nach unten schreiben, beträgt der Kipp- / Umschaltzyklus des n-ten Bits (ab lsb) 2 n . In jedem Zyklus ist die erste Hälfte (von 0 bis 2 n-1 -1) 0 und die letzte Hälfte ist 1. Zum Beispiel wechselt das lsb (erstes Bit von rechts) alle 2 1-1 = 1 Bit. das zweite Bit schaltet alle 2 2-1 = 2 Bits um ...

Infolgedessen nehmen wir modulo 2 n , um die aktuelle Position der Zahl im Zyklus zu ermitteln. Wenn sie kleiner als 2 n-1 ist, ist sie ein Null-Bit, andernfalls ist sie eine Eins.

phuclv
quelle
1

Da Sie nach jeder 12-stelligen Binärzahl suchen, ist es am besten, die "DEC2BIN" -Funktion für jede Zahl von 0 bis 4095 (2 ^ 12-1) zu verwenden. Leider funktioniert DEC2BIN nur mit bis zu 8 Ziffern, sodass die endgültige Formel aufgrund der Verkettung etwas knifflig aussieht:

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

DEC2BIN verwendet die zu konvertierende Zahl und die Anzahl der auszugebenden Stellen. Ich habe 4 und 8 kombiniert, um 12 zu erhalten. Um die ersten 4 Ziffern auf den höchsten Wert zu verschieben, dividiere ich durch 256 (2 ^ 8) und runde ab, um die anderen Ziffern mit dem niedrigeren Wert zu ignorieren. Bei den Ziffern mit dem niedrigeren Wert wird dieser Wert subtrahiert, damit die Zählung nach 255 fortgesetzt wird.

Suchen Sie nach Dezimal-Binär-Konvertierung und Bitverschiebung, um zu verstehen, wie dies funktioniert.

Gops
quelle
1
Netter Job "Code Golfing" (Erstellen von kürzerem Text) im Vergleich zu @Herbs Antwort, obwohl es so aussieht, als ob Sie A1 hart codieren, wo er eine flexiblere ROW () verwendet. Warum sagt er, dass es bis 511 funktioniert, aber Sie sagen, 255. Ist einer von Ihnen ausgeschaltet, oder ist es ein Unterschied in verschiedenen Versionen von Excel?
TOOGAM
stattdessen ROUNDDOWN(A1/256,0)kannst du einfach benutzen QUOTIENT(A1, 256), oder noch besser BITRSHIFT(A1, 8). Letzterer Teil kann auch durch BITANDorMOD
phuclv
-1

Eine Antwort, die die Daten außerhalb von Excel erstellt, jedoch eine CSV-Datei erstellt, die geöffnet werden kann, um die Tabelle in Excel abzurufen.

Dies verwendet Python, könnte aber auch in einer Shell-Sprache erfolgen. Führen Sie es einfach in cmd.exe aus, wenn Python installiert ist.

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

Dies erzeugt eine Datei (binary.csv), die den gewünschten Inhalt enthält, jede Ziffer in separaten Zellen, wie (ich denke) von der Frage gewünscht.

Erläuterung:

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'
Baldrickk
quelle
4
Ich bin nicht der Down-Wähler, sondern "In Excel muss ich generieren ...". Dies ist nicht in Excel. Das Importieren einer CSV-Datei und das Kopieren der Zellen an die richtige Stelle, wenn Sie sie ändern möchten (z. B. mehr / weniger Zeilen), wäre ein Problem.
Tom Carpenter
Dies ist für Python <3, aber> = 2.3. Für vorwärts-Kompatibilität, fügen Sie bitte Klammern , so dass das printSchlüsselwort wie eine Funktion aufgerufen wird - auf diese Weise wird es mit Python kompatibel sein 2.3+ und Python 3.0.0+
wizzwizz4