计算excel单元格列表中的二进制数字
我试图建立一个公式,将一个十进制数列表转换为二进制数,然后计算在某个位置出现的个数。我试图构建一个数组公式,它是这样的:计算excel单元格列表中的二进制数字,excel,Excel,我试图建立一个公式,将一个十进制数列表转换为二进制数,然后计算在某个位置出现的个数。我试图构建一个数组公式,它是这样的: {=SUM(MID(DEC2BIN(A1:A10;10);9;1)} 这将返回#值。有办法做到这一点吗 编辑:添加示例 Input (Binary Equivalent) 2 0000000010 3 0000000101 7 0000000111 7
{=SUM(MID(DEC2BIN(A1:A10;10);9;1)}
这将返回#值。有办法做到这一点吗
编辑:添加示例
Input (Binary Equivalent)
2 0000000010
3 0000000101
7 0000000111
7 0000000111
5 0000000101
9 0000001001
Outputs Result
(digit to sum
from the right)
1 5
2 3
3 3
4 1
如果您试图计数,且许多第二位数设置在一个数字范围内,则可以执行以下操作:
={SUM((MOD(A1:A10,4)>=2)+0)}
为了理解这一点,让我们看一些示例数据
这里我有一些十进制数及其二进制等价物。在C列中,我刚刚提取了第二个数字(即您的MID(A1,9,1)
)。然后在D列中,我只取模的4
。您可以看到,当余数大于2
时,将设置第二个数字
MOD(A1,4)
基本上是将数字除以4
,并给出余数(如果余数表示为4
上的分数,则余数的分子)。对于二进制数,除以二的幂就是右移。除以4
表示右移除以2
,“脱落”的数字为余数。在这种情况下,它是前两位数字。他们可能是
00 | 0
01 | 1
10 | 2
11 | 3
所以我们看到,只有当余数大于2时,才设置第二个数字
注意原始公式中的+0
是将=
的布尔结果转换为整数,这样我们就可以使用SUM
,即SUM({TRUE,FALSE})
不起作用,但SUM({TRUE,FALSE}+0)
计算到SUM({1,0})
,它起作用
要使其通用,假设您希望对$E$1
第个数字执行此操作:
=SUM((MOD(A1:A12,2^$E$1)>=2^($E$1-1))+0)
如果您试图计数,且许多第二位数设置在一个数字范围内,则可以执行以下操作:
={SUM((MOD(A1:A10,4)>=2)+0)}
为了理解这一点,让我们看一些示例数据
这里我有一些十进制数及其二进制等价物。在C列中,我刚刚提取了第二个数字(即您的MID(A1,9,1)
)。然后在D列中,我只取模的4
。您可以看到,当余数大于2
时,将设置第二个数字
MOD(A1,4)
基本上是将数字除以4
,并给出余数(如果余数表示为4
上的分数,则余数的分子)。对于二进制数,除以二的幂就是右移。除以4
表示右移除以2
,“脱落”的数字为余数。在这种情况下,它是前两位数字。他们可能是
00 | 0
01 | 1
10 | 2
11 | 3
所以我们看到,只有当余数大于2时,才设置第二个数字
注意原始公式中的+0
是将=
的布尔结果转换为整数,这样我们就可以使用SUM
,即SUM({TRUE,FALSE})
不起作用,但SUM({TRUE,FALSE}+0)
计算到SUM({1,0})
,它起作用
要使其通用,假设您希望对$E$1
第个数字执行此操作:
=SUM((MOD(A1:A12,2^$E$1)>=2^($E$1-1))+0)
这是另一种方式,例如,对于右边的第二个数字
=SUMPRODUCT(--ISODD(A1:A10/2))
除以2^(n-1),其中n是从右边开始编号的数字:ISODD函数忽略由除法产生的任何分数。这是另一种方法,例如,对于从右边开始的第二个数字
=SUMPRODUCT(--ISODD(A1:A10/2))
除以2^(n-1),其中n是从右边开始编号的数字:ISODD函数忽略由除法产生的任何分数。=SUM(0+MID(DEC2BIN(--A1:A10,10,9,1))
已输入数组
关于=SUM(0+MID(DEC2BIN(--A1:A10,10,9,1))
已输入数组
对于位运算,无需将数字视为字符串
{=SUM(BITAND(A1:A10;2^(C1-1))/2^(C1-1))}
假设您要查找的位置通过位操作存储在
C1
中,则无需将数字视为字符串
{=SUM(BITAND(A1:A10;2^(C1-1))/2^(C1-1))}
假设您要查找的位置存储在
C1
中,请发布一些具有所需输出的示例输入。例如,您是否试图查看有多少十进制数设置了第二个二进制数字?您的错误是因为DEC2BIN
无法接受范围作为其值input@Dan可以,;这只需要一点额外的强制:Lori的简单改进见本文末尾的评论,即=SUM(0+MID(DEC2BIN(-A1:A10,10),9,1))编辑:这应该是=SUM(0+MID(DEC2BIN(-A1:A10,10),9,1)),根据下面发布的解决方案。@XORLX我仍然不明白为什么-
使它不再是语法错误?请发布一些带有所需输出的示例输入。例如,您是否试图查看有多少十进制数设置了第二个二进制数字?您的错误是因为DEC2BIN
无法接受范围作为其值input@Dan可以,;这只需要一点额外的强制:Lori的简单改进见本文末尾的评论,即=SUM(0+MID(DEC2BIN(-A1:A10,10),9,1))编辑:这应该是=SUM(0+MID(DEC2BIN(-A1:A10,10),9,1)),根据下面发布的解决方案。@XORLX我仍然不明白为什么-
使它不再是语法错误?似乎工作得很好,谢谢!不过有一个问题,为什么它需要“+0”才能工作?整洁-也不受dec2bin的限制,只在-512到+511之间工作。似乎工作得很好,谢谢!但是有一个问题,为什么它需要“+0”来工作?整洁-也不受dec2bin的限制,只在-512到+511之间工作。为什么-
使它工作?你有解释这种奇怪行为的链接吗?另外,我认为你需要两个负数,否则你得到的是2s补码,所以=SUM(0+MID(DEC2BIN(-A1:A10,10),9,1))
啊,是的。好的一点,那就是附加的负片。将更正我的帖子。为什么-
使它工作?你有解释这种奇怪行为的链接吗?另外,我认为你需要两张底片,否则你会得到2s补码<