最快捷的方法:

最快捷的方法:

在 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

只需复制粘贴以下公式即可A1

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

然后拖动填充至L4096

截屏

解释:

  • 该公式提取数字的第n 位
  • ROW()代表数字(数字 >= 0)
  • COLUMN()代表 n(n >= 0)
  • 只需将该数字整数除以 2 ^ n,然后计算结果的模数 2。例如,1234 的第 5 位 (10011010010b) 将按如下方式计算:
    • (1234 \ 2 ^ (5 - 1)) % 2
    • = (1234 \ 16) % 2
    • = 77% 2
    • = 1

答案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) 非常容易安装和使用:

  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

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

答案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。

相关内容