Cómo crear una tabla con todas las combinaciones de 0 y 1

15

En Excel, necesito generar una tabla con todas las combinaciones de 1 y 0 para 12 espacios.

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

y así sucesivamente, obteniendo todas las combinaciones como

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

¿Cómo puedo hacer esto?

Pablo Durbin Sprake Martínez
fuente
¿Qué versión de Excel usas?
Máté Juhász
support.office.com/en-us/article/…
Digo Reinstate Monica
1
Puede dividir el número binario en una porción de orden superior y de orden inferior, luego usar Concatenar para unir las dos partes.
Digo reinstalar a Mónica
8
A partir de su representación de la salida deseada, ¿debo considerar que cada dígito debe estar en una celda separada y no en una cadena?
Baldrickk
44
Para referencia futura, la forma de agradecer a las personas en Stack Exchange es usar ese botón ▲. Para la respuesta que funcionó para usted (y le dio el resultado correcto), use ese botón ✔. Si más de una respuesta funciona, elija la que más le guste.
wizzwizz4

Respuestas:

27

Porque 2 ^ 12 = 4096, necesita 4096 celdas (12 para sus 12 bits).

En principio, pones en A1 a A4096 este comando:

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

Eso sería todo, pero solo funciona para 0 ... 511 (9 bits). Entonces aplicamos un truco: dividimos el número en una parte de 3 bits y una de 9 bits y calculamos las dos cadenas por separado, luego las concatenamos.

Por lo tanto tienes:

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

Editar: no estaba al tanto del argumento opcional de número de dígitos. Usarlo le dará esta función:

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

Ponga esto en las celdas A1 a A4096.

Edición 2: Según el comentario de Lưu Vĩnh Phúc, es posible que el OP quisiera 12 columnas con un dígito binario cada una. En este caso, pon

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

en todas las celdas A1 a L 4096.

hierba
fuente
23

Simplemente copie y pegue la siguiente fórmula dentro A1:

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

Luego arrastre y llene hasta L4096.

Captura de pantalla

La fórmula extrae el enésimo bit de un número (n> = 0): el número es entero dividido por 2 ^ n, luego calcula el módulo 2.

Salman A
fuente
9

Primero ingrese la siguiente función definida por el usuario en un módulo estándar:

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

Esto devuelve una cadena de 36 "bits". Luego en A1 ingrese:

=ROW()-1

y copiar a través de A4096

En B1 ingrese:

=RIGHT(bigbinary(A1),12)

y copie a través de B4096 :

manifestación

Las funciones definidas por el usuario (UDF) son muy fáciles de instalar y usar:

  1. Alt- F11abre la ventana VBE
  2. Alt- I, Alt- Mabre un nuevo módulo
  3. pegue las cosas y cierre la ventana VBE

Si guarda el libro, el UDF se guardará con él. Si está utilizando una versión de Excel más tarde que 2003, debe guardar el archivo como .xlsm en lugar de .xlsx

Para eliminar el UDF:

  1. abrir la ventana VBE como se muestra arriba
  2. borrar el código
  3. cierra la ventana de VBE

Para usar el UDF de Excel:

=myfunction(A1)

Para obtener más información sobre las macros en general, consulte:

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

y

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

y para detalles sobre UDF, ver:

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

¡Las macros deben estar habilitadas para que esto funcione!

Estudiante de gary
fuente
¿Seguramente uno podría usar =RIGHT(bigbinary(ROW()-1),12)?
wizzwizz4
@ wizzwizz4 Tienes razón ... con un ligero cambio en el UDF ()
Gary's Student
Acabo de leer la macro y noté que es excesivo: puede pegar la fórmula directamente en el cuadro y luego usar la funcionalidad de hacer clic / arrastrar de Excel para cambiar todas las referencias de celda o, mejor aún, simplemente usar en ROW() - 1lugar de una celda referencia. En un archivo con macros está bien, pero en uno sin él crea una ventana emergente irritante y aterradora.
wizzwizz4
1
@ wizzwizz4 Usé este UDF () porque ya lo tenía en mi caja de herramientas de VBA
Gary's Student
3

Otra forma que he usado:

  • Rellenar de A1a L1con ceros
  • En A2escritura=1-A1
  • En B2escritura=IF( AND( A1=1, A2=0), 1-B1, B1)
  • Copiar B2fórmula aC2:L2
  • Copiar A2:L2fórmulas de fila a filas3:4096

Esto produce todas las cadenas binarias en orden, con bits menos significativos en la primera columna. La última fila (4096) son todas.

Esto no depende ROW()(por lo que puede moverse libremente), puede aumentar la longitud directamente y es sencillo generalizar a cadenas no binarias. También funciona con LibreOffice Calc.

leonbloy
fuente
3

Ponga la siguiente fórmula en cada celda de A a L, para todas las filas del 1 al 4096

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

Si quieres todo en una cadena con espacios como lo que pediste, pon esto en la última columna

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

Luego arrastre las filas hasta el final hasta M4096

Para una solución más general, coloque el número de bits en alguna celda, como Z1, o una celda con nombre NumOfBitsy use la siguiente fórmula

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

También se puede modificar fácilmente para usar cualquier celda como celda inicial cambiando el desplazamiento de fila y columna

Versión optimizada que utiliza operaciones bit a bit en lugar de potencias:

=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 manera mas rapida:

  • Copie cualquiera de las fórmulas anteriores
  • Presione F5(o Ctrl+ G) e ingrese A1: L4096 para seleccionar todo el rango
  • Presione F2luego Ctrl+ Vpara pegar
  • Presione Ctrl+ Shift+ Enter. Auge. Ya terminaste No es necesario arrastrar

Es una fórmula de matriz que es mucho más rápida de calcular y producir un archivo mucho más pequeño


Explicación:

Si escribimos todas las representaciones binarias en filas de arriba a abajo, el ciclo de alternar / alternar el enésimo bit (contando desde lsb) es 2 n . En cada ciclo, la primera mitad (de 0 a 2 n-1 -1) será 0 y la última mitad será 1. Por ejemplo, lsb (primer bit desde la derecha) alternará cada 2 1-1 = 1 bit, el segundo bit se alternará cada 2 2-1 = 2 bits ...

Como resultado, tomaremos el módulo 2 n para obtener la posición actual del número en el ciclo, si es menor que 2 n-1 es un bit cero, de lo contrario es uno.

phuclv
fuente
1

Como lo que está buscando es cada número binario de 12 dígitos, su mejor opción es utilizar la función "DEC2BIN" en cada número del 0 al 4095 (2 ^ 12-1). Desafortunadamente, DEC2BIN solo funciona hasta 8 dígitos, por lo que la fórmula final parece un poco complicada debido a la concatenación:

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

DEC2BIN toma el número para convertir y el número de dígitos que desea generar. Combiné 4 y 8 para obtener 12. Para desplazar los primeros 4 dígitos hasta el valor más alto, divido por 256 (2 ^ 8) y redondeo hacia abajo para ignorar los otros dígitos de menor valor. Para los dígitos de menor valor, reste este valor para que continúen contando más allá de 255.

Busque la conversión de decimal a binario y el desplazamiento de bits para comprender cómo funciona esto.

Gops
fuente
1
Buen trabajo "codificar golf" (crear texto más corto) en comparación con la respuesta de @Herb, aunque parece que usted codifica A1 donde usa un ROW más flexible (). ¿Por qué dice que funciona hasta 511 pero usted dice 255. ¿Está uno de ustedes apagado o es una diferencia en diferentes versiones de Excel?
TOOGAM
en lugar de ROUNDDOWN(A1/256,0)solo puedes usar QUOTIENT(A1, 256), o incluso mejor BITRSHIFT(A1, 8). La última parte también se puede reemplazar con BITANDoMOD
phuclv
-1

Una respuesta que crea los datos fuera de Excel, pero crea un .csv que se puede abrir para obtener la tabla en Excel.

Esto usa python, pero también se puede hacer en un lenguaje de shell. Simplemente ejecútelo en cmd.exe si Python está instalado.

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

Esto crea un archivo (binary.csv) que contiene el contenido deseado, cada dígito en celdas separadas como (creo) se desea de la pregunta.

explicación:

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
fuente
44
No soy el votante negativo, pero "En Excel, necesito generar ...". Esto no está en Excel. Importar un CSV y copiar las celdas en el lugar correcto cada vez que desee modificarlo (por ejemplo, más / menos filas) sería un problema.
Tom Carpenter
Esto es para Python <3 pero> = 2.3. Para compatibilidad hacia adelante, agregue paréntesis para que la printpalabra clave se llame como una función, de esa manera será compatible con Python 2.3+ y Python 3.0.0+
wizzwizz4