Como criar uma tabela com todas as combinações de 0 e 1

15

No Excel, preciso gerar uma tabela com todas as combinações de 1 e 0 para 12 espaços.

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 assim por diante, obtendo todas as combinações como

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

Como posso fazer isso?

    
por Pablo Durbin Sprake Martínez 17.05.2017 / 13:23

7 respostas

27

Como 2 ^ 12 = 4096, você precisa de 4096 células (12 para seus 12 bits).

Em princípio, você coloca em A1 para A4096 este comando:

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

Isso seria, mas funciona apenas para 0 ... 511 (9 bits). Então, aplicamos um truque: dividimos o número em uma parte de 3 bits e 9 bits e calculamos as duas strings separadamente, depois as concatenamos.

Daí você tem:

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

Editar: Eu não estava ciente do argumento do número opcional de dígitos. Usá-lo dará essa função:

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

Coloque isso nas células A1 para A4096.

Editar 2: De acordo com o comentário de Lưu Vĩnh Phúc, é possível que o OP tenha 12 colunas com um dígito binário cada. Neste caso, coloque

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

em todas as células A1 para L 4096.

    
por 17.05.2017 / 14:17
22

Copie e cole a seguinte fórmula em A1 :

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

Em seguida, arraste e encha até L4096 .

A fórmula extrai o enésimo bit de um número (n > = 0): o número é inteiro dividido por 2 ^ n, depois calcula o módulo 2.

    
por 18.05.2017 / 10:53
9

Primeiro, insira a seguinte função definida pelo usuário em um módulo padrão:

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

Isto retorna uma string de 36 "bits". Em A1 digite:

=ROW()-1

e copie para baixo A4096

Em B1 digite:

=RIGHT(bigbinary(A1),12)

e copie para baixo através de B4096 :

FunçõesDefinidaspeloUsuário(UDFs)sãomuitofáceisdeinstalareusar:

  1. Alt-F11abreajaneladoVBE
  2. Alt-I,Alt-Mabreumnovomódulo
  3. coleomaterialefecheajaneladoVBE

Sevocêsalvarapastadetrabalho,aUDFserásalvacomela.SevocêestiverusandoumaversãodoExcelposteriora2003,deverásalvaroarquivocomo.xlsmemvezde.xlsx

PararemoveroUDF:

  1. abrirajaneladoVBEcomoacima
  2. limpeocódigo
  3. fecheajaneladoVBE

ParausaroUDFdoExcel:

=myfunction(A1)

Parasabermaissobremacrosemgeral,consulte:

link

e

link

e para detalhes sobre UDFs, consulte:

link

As macros devem estar ativadas para que isso funcione!

    
por 17.05.2017 / 13:53
3

Coloque a seguinte fórmula em cada célula de A a L, para todas as linhas de 1 a 4096

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

Se você quiser a coisa toda em uma string com espaços como o que você pediu, coloque isso na última coluna

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

e arraste todo o caminho até a A4096: L4096

Para uma solução geral, coloque o número de bits em alguma célula, como Z1, ou célula nomeada como NumOfBits e use a seguinte fórmula

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

Versão otimizada:

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

Explicação:

Se escrevermos todas as representações binárias em linhas de cima para baixo, o ciclo de inversão / alternância do enésimo bit (contando a partir do lsb) é 2 n . Em cada ciclo a primeira metade (de 0 a 2 n-1 -1) será 0 e a última metade será 1. Por exemplo, o lsb (primeiro bit da direita) alternará a cada 2 1-1 = 1 bit, o segundo bit alternará cada 2 2-1 = 2 bits ...

Como resultado, usaremos o módulo 2 n para obter a posição atual do número no ciclo, se for menor que 2 n-1 é um bit zero, senão é um.

    
por 17.05.2017 / 15:57
3

Outra maneira que usei:

  • Preencha de A1 para L1 com zeros
  • Em A2 write =1-A1
  • Em B2 write =IF( AND( A1=1, A2=0), 1-B1, B1)
  • Copie a fórmula B2 para C2:L2
  • Copiar linha A2:L2 fórmulas para linhas 3:4096

Isso produz todas as cadeias binárias em ordem, com bits menos significativos na primeira coluna. A última linha (4096) é todas.

Isso não depende de ROW() (para que possa ser movido livremente), você pode aumentar o comprimento diretamente, e é fácil generalizar para strings não-binárias. Também funciona com o LibreOffice Calc.

    
por 18.05.2017 / 15:50
1

Como o que você está procurando é cada número binário de 12 dígitos, sua melhor aposta é usar a função "DEC2BIN" em cada número de 0 a 4095 (2 ^ 12-1). Infelizmente, o DEC2BIN só funciona com até 8 dígitos, então a fórmula final parece um pouco complicada devido à concatenação:

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

O DEC2BIN usa o número para converter e o número de dígitos que você deseja gerar. Combinei 4 e 8 para obter 12. Para deslocar os primeiros 4 dígitos até o valor mais alto, divido por 256 (2 ^ 8) e arredondar para baixo para ignorar os outros dígitos do valor inferior. Para os dígitos de valor mais baixo, subtraia esse valor para que eles continuem contando depois de 255.

Pesquise conversão decimal para binário e mudança de bit para entender como isso funciona.

    
por 17.05.2017 / 13:56
-1

Uma resposta que cria os dados fora do Excel, mas cria um .csv que pode ser aberto para obter a tabela no Excel.

Isso usa python, mas também pode ser feito em uma linguagem shell. Basta executá-lo em cmd.exe se o python estiver instalado.

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

Isso cria um arquivo (binary.csv) que contém o conteúdo desejado, cada dígito em células separadas como (eu acho) é desejado a partir da pergunta.

explicação:

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'
    
por 17.05.2017 / 16:29