Java 计算两个具有相同属性的给定二进制数之间存在多少个X数为1位的二进制数

Java 计算两个具有相同属性的给定二进制数之间存在多少个X数为1位的二进制数,java,binary,combinatorics,Java,Binary,Combinatorics,这对我来说是一个挑战已经有一段时间了 给定两个表示二进制数的数组,A和C具有相同的大小,由数字0或1表示的位组成,这样C>A,并且两者都具有相同的1位X数,那么计算有多少二进制B存在,这样A

这对我来说是一个挑战已经有一段时间了

给定两个表示二进制数的数组,A和C具有相同的大小,由数字0或1表示的位组成,这样C>A,并且两者都具有相同的1位X数,那么计算有多少二进制B存在,这样A 例如:对于A={0,1,0,0,1}C={1,0,1,0,0}X=2 所有的B都是{0,1,0,1,0},{0,1,1,0,0},{1,0,0,1},{1,0,0,0,1,0},这将给我答案4。有4个二进制文件,其中2个“1”位介于01001和10100之间

我有一个生成下一个B的算法,给出了一些A,但我觉得继续生成下一个B并检查我是否已经命中C二进制文件是没有效率的


有没有办法在不生成B的情况下计算A和C之间B的确切数目?

我不知道你是否有答案,但让我试试看

在下面的所有讨论中,我们只对x1位的数字感兴趣。我不会一直这么说,为了让事情更简单

那么,假设我们可以计算出低于给定值a:smallerA的数字的计数。要找到A和C之间的数字计数,我们可以将其计算为smallerC-smallerA-1

让我们定义一个函数,用于计算Y位空间中存在多少个具有X位的数字,countX,Y,例如count1,3=3 001,010,100和count2,3=3 011,101,110。这是标准组合数学,即从袋子中拉出编号为1到Y的X个球的组合数

count(X, Y) = Y! / ((Y-X)! * X!)
哪里有X!是阶乘

现在我将展示下一部分,如何使用示例计算smallerA。设A=010100

首先,数一数右边2的0。然后,A下面有count1、2个数字,其中最右边的1位移动到右边的010010010、010010001

提示:使用

删除该1位,留下A=010000


提示:使用A=A^1为什么您担心算法的效率?除非你要用数百万位来计算这个数字,或者用数百万次来计算,否则就要追求优雅和清晰,而忽略效率。从A迭代到C,用N 1位计算数字似乎是最简单的解决方案,而且可能足够有效;在这种情况下,如果我是你,我就不会担心效率。你的算法在哪里?我承认,其中一个原因是出于好奇。我只是想知道有没有“公式”之类的东西。另一个更重要的原因是,对于数组中的任何附加单元,二进制文件的总数乘以2,因此如果我有A[50]和C[50],我必须使用算法生成B的次数可能会达到数百万、数十亿等。老实说,很可能存在一个可以使用的组合公式;如果我是你,我会发邮件的。如果你有一个算法,我可以为你写一个程序。这实际上是一个数学系的人告诉我的完全相同的算法,但这对程序员来说更友好,哈哈。太神了非常感谢您花时间解释!链接到其他人的答案
smaller(A) = count(1, 2) + count(2, 4) + count(3, 7)