如何创建一个包含0和1的所有组合的表


15

在Excel中,我需要生成一个表,其中包含12个空格的1和0的所有组合。

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

等等,得到所有的组合,如

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

我怎样才能做到这一点?


你使用的是哪个版本的Excel?
MátéJuhász


1
他可以将二进制数分成高阶和低阶部分,然后使用连接将两部分拼接在一起。
Twisty Impersonator

8
从你对所需输出的表示来看,我是否认为每个数字应该在一个单独的单元格中,而不是在一个字符串中?
Baldrickk

4
为了将来参考,感谢Stack Exchange上的人们正在使用▲按钮。对于适合您的答案(并给出了正确的结果),请使用该✔按钮。如果有多个答案有效,请选择您最喜欢的答案。
wizzwizz4 2017年

Answers:


27

因为2 ^ 12 = 4096,所以需要4096个单元格(12位为12位)。

原则上,你把这个命令放入A1到A4096:

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

那就是它,但它只适用于0 ... 511(9位)。所以我们应用一个技巧:我们将数字分成3位和9位部分并分别计算两个字符串,然后将它们连接起来。

因此你有:

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

编辑:我不知道可选的位数参数。使用它将提供此功能:

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

将其放入A1至A4096的单元格中。

编辑2:根据LưuVĩnhPhúc的评论,OP可能需要12列,每列有一个二进制数字。在这种情况下,放

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

进入所有细胞A1至L 4096。


23

只需复制粘贴以下公式A1

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

然后拖动填充L4096

截图

公式提取数字的第n位(n> = 0):数字是整数除以2 ^ n,然后计算模数2。


9

首先在标准模块中输入以下用户定义函数:

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

这将返回一个36“位”的字符串。 然后在A1输入:

=ROW()-1

并通过A4096向下复制

B1输入:

=RIGHT(bigbinary(A1),12)

并通过B4096向下复制:

演示

用户定义函数(UDF)非常易于安装和使用:

  1. Alt- 调F11出VBE窗口
  2. Alt- IAlt- M打开一个新模块
  3. 粘贴内容并关闭VBE窗口

如果保存工作簿,UDF将随之保存。如果您在2003年之后使用的是Excel版本,则必须将文件另存为.xlsm而不是.xlsx

要删除UDF:

  1. 如上所述调出VBE窗口
  2. 清除代码
  3. 关闭VBE窗口

要从Excel使用UDF:

=myfunction(A1)

要了解有关宏的更多信息,请参阅:

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

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

有关UDF的详细信息,请参阅:

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

必须启用宏才能使其正常工作!


当然可以使用一个=RIGHT(bigbinary(ROW()-1),12)
wizzwizz4 2017年

@ wizzwizz4你是对的......随着UDF
加里的学生

我刚刚阅读了宏并注意到它太过分了 - 您可以直接将公式粘贴到框中,然后使用Excel的单击/拖动功能来更改所有单元格引用,或者 - 更好的是,只需使用ROW() - 1而不是单元格参考。在一个带有宏的文件中它很好,但是在一个没有宏的文件中会创建一个令人烦恼且看起来很可怕的弹出窗口。
wizzwizz4 2017年

1
@ wizzwizz4我使用了这个UDF(),因为我已经在我的VBA工具箱中使用了它
Gary的学生

3

我用过的另一种方式:

  • 从填充A1L1具有零
  • A2=1-A1
  • B2=IF( AND( A1=1, A2=0), 1-B1, B1)
  • B2公式复制到C2:L2
  • 将行A2:L2公式复制到行3:4096

这将按顺序生成所有二进制字符串,第一列上的最低有效位。最后一行(4096)就是全部。

这不依赖ROW()(因此它可以自由移动),你可以直接增加长度,并且可以直接推广到非二进制字符串。它也适用于LibreOffice Calc。


3

对于从1到4096的所有行,将以下公式放在从A到L的每个单元格中

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

如果你想要整个字符串中包含空格,就像你要求的那样,把它放在最后一列

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

然后将行一直拖动到M4096

对于更通用的解决方案,将位数放在某个单元格中,如Z1,或命名单元格,NumOfBits并使用以下公式

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

通过更改行和列偏移量,也可以轻松修改它以将任何单元格用作起始单元格

使用按位运算而不是幂的优化版本:

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

最快的方式:

  • 复制上述任一公式
  • F5(或Ctrl+ G)并输入A1:L4096以选择整个范围
  • 按,F2然后按Ctrl+ V粘贴
  • Ctrl+ Shift+ Enter。繁荣。你完成了。无需拖动

这是一个数组公式,它可以更快地计算并生成更小的文件


说明:

如果我们从上到下按行写入所有二进制表示,则第n位(从lsb计数)的翻转/切换周期为2 n。在每个周期中,前半部分(从0到2 n-1 -1)将为0,后半部分将为1.例如,lsb(右起第一位)将每2 1-1 = 1位交替,第二位将每2 2-1 = 2位切换...

因此,我们将采用模2 n来获得数字在循环中的当前位置,如果它小于2 n-1则为零位,否则它是1。


1

因为您要查找的是每12位二进制数,您最好的选择是在0到4095(2 ^ 12-1)的每个数字上使用“DEC2BIN”功能。不幸的是DEC2BIN只能工作8位数,所以最终的公式看起来有点棘手,因为它的串联:

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

DEC2BIN获取要转换的数字和要输出的数字位数。我将4和8组合得到12.要将前4位数字移动到最高值,我除以256(2 ^ 8)并向下舍入以忽略其他较低值数字。对于较低的数字值,减去该值,以便它们将继续计数超过255。

搜索十进制到二进制转换和位移以了解其工作原理。


1
与@Herb的答案相比,“代码打高尔夫球”(创建更短的文本)很好,虽然看起来你硬编码A1,他使用更灵活的ROW()。为什么他说它可以通过511工作,但你说255.你们中的一个是关闭的,还是在不同版本的Excel中有区别?
TOOGAM

而不是ROUNDDOWN(A1/256,0)你可以使用QUOTIENT(A1, 256),甚至更好BITRSHIFT(A1, 8)。后一部分还可以与取代BITANDMOD
phuclv

-1

一个在excel之外创建数据的答案,但创建了一个可以打开的.csv来获取excel中的表。

这使用python,但也可以用shell语言完成。如果安装了python,只需在cmd.exe中运行它。

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

这将创建一个文件(binary.csv),其中包含所需的内容,每个数字在单独的单元格中(我认为)是需要的问题。

说明:

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
我不是选民,但“在Excel中,我需要生成......”。这不是很好。导入CSV并在任何时候将单元格复制到正确的位置(例如,更多/更少的行)将是一个痛苦。
汤姆卡彭

这适用于Python <3但> = 2.3。为了向前兼容,请添加括号,以便print关键字被调用为函数 - 这将与Python 2.3+和Python 3.0.0+兼容
wizzwizz4 2017年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.