Come creare una tabella con tutte le combinazioni di 0 e 1


15

In Excel, devo generare una tabella con tutte le combinazioni di 1 e 0 per 12 spazi.

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

e così via e così via, ottenendo tutte le combinazioni come

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

Come posso fare questo?


quale versione di Excel usi?
Máté Juhász,


1
Può dividere il numero binario in una porzione di ordine superiore e inferiore, quindi utilizzare Concatenate per unire le due parti.
Dico Reintegrare Monica

8
Dalla tua rappresentazione dell'output desiderato, devo prendere che ogni cifra dovrebbe essere in una cella separata e non in una stringa?
Baldrickk,

4
Per riferimento futuro, il modo per ringraziare le persone su Stack Exchange sta usando quel pulsante ▲. Per la risposta che ha funzionato per te (e ha dato il risultato giusto), usa quel pulsante ✔. Se più di una risposta funziona, scegli quella che ti piace di più.
wizzwizz4,

Risposte:


27

Perché 2 ^ 12 = 4096, hai bisogno di 4096 celle (12 per i tuoi 12 bit).

In linea di principio, si inserisce in A1 in A4096 questo comando:

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

Sarebbe, ma funziona solo per 0 ... 511 (9 bit). Quindi applichiamo un trucco: dividiamo il numero in una parte di 3 bit e una di 9 bit e calcoliamo le due stringhe separatamente, quindi concatenatele.

Quindi hai:

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

Modifica: non ero a conoscenza dell'argomento del numero opzionale di cifre. Usarlo darà questa funzione:

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

Mettilo nelle celle da A1 a A4096.

Modifica 2: Secondo il commento di Lưu Vĩnh Phúc, è possibile che l'OP abbia voluto 12 colonne con una cifra binaria ciascuna. In questo caso, metti

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

in tutte le celle da A1 a L 4096.


23

Basta copiare e incollare la seguente formula all'interno A1:

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

Quindi trascina fino a L4096.

Immagine dello schermo

La formula estrae l'ennesimo bit di un numero (n> = 0): il numero è intero diviso per 2 ^ n, quindi calcola il modulo 2.


9

Inserire innanzitutto la seguente funzione definita dall'utente in un modulo 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

Ciò restituisce una stringa di 36 "bit". Quindi in A1 inserire:

=ROW()-1

e copia verso il basso attraverso A4096

In B1 inserire:

=RIGHT(bigbinary(A1),12)

e copia giù attraverso B4096 :

dimostrazione

Le funzioni definite dall'utente (UDF) sono molto facili da installare e utilizzare:

  1. Alt- F11visualizza la finestra VBE
  2. Alt- I, Alt- Mapre un nuovo modulo
  3. incollare il materiale e chiudere la finestra VBE

Se si salva la cartella di lavoro, l'UDF verrà salvato con essa. Se si utilizza una versione di Excel successiva al 2003, è necessario salvare il file come .xlsm anziché .xlsx

Per rimuovere l'UDF:

  1. visualizza la finestra VBE come sopra
  2. cancella il codice
  3. chiudere la finestra VBE

Per utilizzare l'UDF da Excel:

=myfunction(A1)

Per ulteriori informazioni sulle macro in generale, vedere:

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

e

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

e per le specifiche sugli UDF, vedere:

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

Le macro devono essere abilitate affinché funzioni!


Sicuramente si potrebbe semplicemente usare =RIGHT(bigbinary(ROW()-1),12)?
wizzwizz4,

@ wizzwizz4 Hai ragione ... con una leggera modifica all'UDF ()
Gary's Student,

Ho appena letto la macro e ho notato che è eccessivo: potresti semplicemente incollare la formula direttamente nella casella, quindi utilizzare la funzionalità di clic / trascinamento di Excel per modificare tutti i riferimenti di cella o - ancora meglio, basta usare ROW() - 1invece di una cella riferimento. In un file con macro va bene, ma in uno senza crea un popup irritante e spaventoso.
wizzwizz4,

1
@ wizzwizz4 Ho usato questo UDF () perché lo avevo già nella mia cassetta degli attrezzi VBA
Gary's Student

3

Un altro modo che ho usato:

  • Riempi da A1a L1con zero
  • Per A2iscritto=1-A1
  • Per B2iscritto=IF( AND( A1=1, A2=0), 1-B1, B1)
  • Copia la B2formula inC2:L2
  • Copia le A2:L2formule delle righe nelle righe3:4096

Questo produce tutte le stringhe binarie in ordine, con bit meno significativi sulla prima colonna. L'ultima riga (4096) è tutta una.

Questo non dipende ROW()(quindi può essere spostato liberamente), è possibile aumentare direttamente la lunghezza ed è semplice generalizzare a stringhe non binarie. Funziona anche con LibreOffice Calc.


3

Inserisci la seguente formula in ogni cella da A a L, per tutte le righe da 1 a 4096

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

Se vuoi il tutto in una stringa con spazi come quello che hai chiesto, inseriscilo nell'ultima colonna

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

Quindi trascinare le file fino in fondo fino a M4096

Per una soluzione più generale, inserisci il numero di bit in qualche cella, come Z1, o come cella simile NumOfBitse usa la seguente formula

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

Può anche essere facilmente modificato per utilizzare qualsiasi cella come cella iniziale modificando l'offset di riga e colonna

Versione ottimizzata usando operazioni bit per bit invece di potenze:

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

Il modo più veloce:

  • Copia una delle formule sopra
  • Premere F5(o Ctrl+ G) e immettere A1: L4096 per selezionare l'intero intervallo
  • Premi F2quindi Ctrl+ Vper incollare
  • Premi Ctrl+ Shift+ Enter. Boom. Hai finito. Non è necessario trascinare

È una formula di matrice che è molto più veloce per calcolare e produrre un file molto più piccolo


Spiegazione:

Se scriviamo tutte le rappresentazioni binarie in righe dall'alto verso il basso, il ciclo di rotazione / commutazione dell'ennesimo bit (contando da lsb) è 2 n . In ogni ciclo la prima metà (da 0 a 2 n-1 -1) sarà 0 e l'ultima metà sarà 1. Ad esempio lsb (primo bit da destra) si alternerà ogni 2 1-1 = 1 bit, il secondo bit commuta ogni 2 2-1 = 2 bit ...

Di conseguenza prenderemo modulo 2 n per ottenere la posizione corrente del numero nel ciclo, se è inferiore a 2 n-1 è un bit zero, altrimenti è uno.


1

Poiché quello che stai cercando è un numero binario di 12 cifre, la soluzione migliore è utilizzare la funzione "DEC2BIN" su ogni numero compreso tra 0 e 4095 (2 ^ 12-1). Sfortunatamente DEC2BIN funziona solo fino a 8 cifre, quindi la formula finale sembra un po 'complicata a causa della concatenazione:

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

DEC2BIN accetta il numero da convertire e il numero di cifre che si desidera emettere. Ho combinato 4 e 8 per ottenere 12. Per spostare le prime 4 cifre fino al valore più alto, divido per 256 (2 ^ 8) e arrotondare per ignorare le altre cifre di valore inferiore. Per le cifre con valore inferiore sottrarre questo valore in modo che continuino a contare oltre 255.

Cerca la conversione da decimale a binario e lo spostamento dei bit per capire come funziona.


1
Bel lavoro "code golfing" (creazione di testo più breve) rispetto alla risposta di @Herb, sebbene sembri un hard-code A1 in cui usa un ROW () più flessibile. Perché dice che funziona fino al 511 ma tu dici 255. Uno di voi è spento o è una differenza nelle diverse versioni di Excel?
TOOGAM,

invece di ROUNDDOWN(A1/256,0)te puoi semplicemente usare QUOTIENT(A1, 256), o anche meglio BITRSHIFT(A1, 8). Quest'ultima parte può anche essere sostituita con BITANDoMOD
phuclv

-1

Una risposta che crea i dati al di fuori di Excel, ma crea un file CSV che può essere aperto per ottenere la tabella in Excel.

Questo utilizza Python, ma potrebbe essere fatto anche in un linguaggio shell. Eseguilo in cmd.exe se è installato python.

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

Questo crea un file (binary.csv) che contiene il contenuto desiderato, ogni cifra in celle separate come (penso) sia desiderata dalla domanda.

spiegazione:

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
Non sono il votante verso il basso, ma "In Excel, ho bisogno di generare ...". Questo non è in Excel. Importare un CSV e copiare le celle nel posto giusto ogni volta che vuoi modificarlo (ad es. Più / meno righe) sarebbe una seccatura.
Tom Carpenter,

Questo è per Python <3 ma> = 2.3. Per la printcompatibilità con il futuro , aggiungi parentesi quadre in modo che la parola chiave sia chiamata come una funzione, in questo modo sarà compatibile con Python 2.3+ e Python 3.0.0+
wizzwizz4,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.