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?

Pablo Durbin Sprake Martínez
fonte
qual versão do Excel você usa?
Máté Juhász
1
Ele pode dividir o número binário em uma porção de ordem alta e baixa, e então usar Concatenate para costurar as duas partes juntas.
Twisty Impersonator
8
Da sua representação da saída desejada, devo considerar que cada dígito deve estar em uma célula separada e não em uma string?
Baldrickk
4
Para referência futura, a maneira de agradecer às pessoas no Stack Exchange é usar esse botão ▲. Para a resposta que funcionou para você (e deu o resultado correto), use o botão ✔. Se mais de uma resposta funcionar, escolha aquela que você mais gosta.
wizzwizz4

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.

Por isso 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 eu 4096

Herb
fonte
22

Basta copiar e colar a seguinte fórmula dentro A1:

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

Em seguida, arraste-o para L4096.

Screenshot

A fórmula extrai o enésimo bit de um número (n & gt; = 0): o número é inteiro dividido por 2 ^ n e, em seguida, calcula o módulo 2.

Salman A
fonte
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

Isso retorna uma string de 36 "bits". Então em A1 entrar:

=ROW()-1

e copie para baixo A4096

Em B1 entrar:

=RIGHT(bigbinary(A1),12)

e copie para baixo B4096 :

demo

Funções Definidas pelo Usuário (UDFs) são muito fáceis de instalar e usar:

  1. Alt - F11 traz a janela do VBE
  2. Alt - Eu , Alt - M abre um novo módulo
  3. cole as coisas e feche a janela do VBE

Se você salvar a pasta de trabalho, a UDF será salva com ela. Se você estiver usando uma versão do Excel posterior a 2003, deverá salvar o arquivo como .xlsm em vez de .xlsx

Para remover o UDF:

  1. abrir a janela do VBE como acima
  2. limpe o código
  3. feche a janela do VBE

Para usar o UDF do Excel:

=myfunction(A1)

Para aprender mais sobre macros em geral, veja:

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

e

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

e para detalhes sobre UDFs, consulte:

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

As macros devem estar habilitadas para que isso funcione!

Gary's Student
fonte
Certamente, pode-se usar =RIGHT(bigbinary(ROW()-1),12)?
wizzwizz4
@ wizzwizz4 Você está correto ... com uma ligeira mudança para o UDF ()
Gary's Student
Acabei de ler a macro e notei que é exagero - você pode simplesmente colar a fórmula diretamente na caixa e usar a funcionalidade clicar / arrastar do Excel para alterar todas as referências de célula ou - melhor ainda, apenas usar ROW() - 1 em vez de uma referência de célula. Em um arquivo com macros está tudo bem, mas em um sem isso cria um popup irritante e assustador.
wizzwizz4
1
@ wizzwizz4 eu usei isso UDF () porque eu já tinha na minha caixa de ferramentas VBA
Gary's Student
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é 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á a cada 2 2-1 = 2 bits ...

Como resultado, vamos usar 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.

phuclv
fonte
3

Outra maneira que usei:

  • Preencher de A1 para L1 com zeros
  • Em A2 escrever =1-A1
  • Em B2 escrever =IF( AND( A1=1, A2=0), 1-B1, B1)
  • cópia de B2 fórmula 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 ROW() (para que possa ser movido livremente), você pode aumentar o comprimento diretamente, e é fácil generalizá-lo para cadeias não binárias. Também funciona com o LibreOffice Calc.

leonbloy
fonte
1

Como o que você está procurando é um número binário de 12 dígitos, sua melhor opção é 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, porque da 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 mais baixo. Para os dígitos de valor mais baixo, subtraia esse valor para que eles continuem contando depois de 255.

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

Gops
fonte
1
Bom trabalho "code golfing" (criação de texto mais curto) em comparação com a resposta do @Herb, embora pareça que você codifica o A1, onde ele usa um ROW () mais flexível. Por que ele diz que funciona até 511, mas você diz 255. É um de vocês fora, ou é uma diferença em diferentes versões do Excel?
TOOGAM
ao invés de ROUNDDOWN(A1/256,0) você pode simplesmente usar QUOTIENT(A1, 256)ou melhor ainda BITRSHIFT(A1, 8). A última parte também pode ser substituída por BITAND ou MOD
phuclv
-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 pode ser feito em uma linguagem shell também. 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 da questão.

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'
Baldrickk
fonte
4
Eu não sou o eleitor de baixo, mas "no Excel, eu preciso gerar ...". Isso não está no excel. Importar um CSV e copiar as células para o lugar certo sempre que você quiser modificá-lo (por exemplo, mais / menos linhas) seria uma dor.
Tom Carpenter
Isso é para Python & lt; 3, mas & gt; = 2,3. Para compatibilidade com versões anteriores, adicione parêntesis para que print A palavra-chave é chamada como uma função - dessa forma, ela será compatível com o Python 2.3+ e o Python 3.0.0+
wizzwizz4