在 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
我怎样才能做到这一点?
答案1
因为 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ưu Vĩnh Phúc 的评论,OP 可能想要 12 列,每列一个二进制数字。在这种情况下,
=MID( DEC2BIN((ROW()-1)/512,3) & DEC2BIN(MOD((ROW()-1),512),9) ,COL(),1)
到所有单元格 A1 至大号4096.
答案2
答案3
首先在标准模块中输入以下用户定义函数:
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) 非常容易安装和使用:
- Alt-F11打开 VBE 窗口
- Alt- I,Alt-M打开一个新模块
- 粘贴内容并关闭 VBE 窗口
如果您保存工作簿,UDF 将随之保存。如果您使用的是 2003 之后的 Excel 版本,则必须将文件保存为 .xlsm 而不是 .xlsx
要删除 UDF:
- 调出如上所示的 VBE 窗口
- 清除代码
- 关闭 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
必须启用宏才能使其工作!
答案4
将以下公式放入从 A 到 L 的每个单元格中,适用于从 1 到 4096 的所有行
=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 位(从最低位开始计数)的翻转/切换周期为 2 n。在每个周期中,前半部分(从 0 到 2 n-1 -1)将为 0,后半部分将为 1。例如,最低位(从右边开始的第一位)每 2 1-1 = 1 位交替一次,第二位每 2 2-1 = 2 位切换一次...
因此,我们将对 2 n取模来获取数字在循环中的当前位置,如果它小于 2 n-1,则为零位,否则为 1。