在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中,我需要生成一个表,其中包含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
我怎样才能做到这一点?
Answers:
因为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。
首先在标准模块中输入以下用户定义函数:
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)非常易于安装和使用:
如果保存工作簿,UDF将随之保存。如果您在2003年之后使用的是Excel版本,则必须将文件另存为.xlsm而不是.xlsx
要删除UDF:
要从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)
?
ROW() - 1
而不是单元格参考。在一个带有宏的文件中它很好,但是在一个没有宏的文件中会创建一个令人烦恼且看起来很可怕的弹出窗口。
对于从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)
这是一个数组公式,它可以更快地计算并生成更小的文件
说明:
如果我们从上到下按行写入所有二进制表示,则第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。
因为您要查找的是每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。
搜索十进制到二进制转换和位移以了解其工作原理。
ROUNDDOWN(A1/256,0)
你可以使用QUOTIENT(A1, 256)
,甚至更好BITRSHIFT(A1, 8)
。后一部分还可以与取代BITAND
或MOD
一个在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'
print
关键字被调用为函数 - 这将与Python 2.3+和Python 3.0.0+兼容