繁体   English   中英

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

[英]Calculate how many binary numbers with X number of 1 bits exist between two given binary numbers with the same property

一段时间以来,这一直是我的挑战。

给定两个表示二进制数的数组,A和C具有相同的大小,由数字0或1表示的位组成,使得C> A,并且都具有相同的X位数1,这是最有效的方法计算存在多少个二进制B,使得A <B <C,并且每个B也具有X个1位数字?

示例:对于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,0,1},{1,0,0,1,0 },它会给我答案4。在01001和10100之间有4个二进制文件,带有2个“ 1”位。

我有一个算法可以给定一些A来生成下一个B,但是我觉得继续生成下一个B并检查我是否已经达到C二进制代码效率不高。

有什么方法可以在不生成B的情况下计算A和C之间B的确切数目?

不知道您是否在https://math.stackexchange.com/上找到了答案,但是让我take一下。

在下面的所有讨论中,我们只对X 1位的数字感兴趣。 为了简单起见,我不会再这么说了。

因此,假设我们可以计算低于给定值A的数字计数: smaller(A) 要找到AC之间的数字计数,我们可以将其计算为smaller(C) - smaller(A) - 1

让我们定义计数多少数字与X个比特在Y位的空间中存在的功能, count(X, Y)例如count(1, 3) = 3001010100 )和count(2, 3) = 3011101110 )。 这是标准组合数学,即从袋子中拉出编号为1到Y的X球的组合数量。

count(X, Y) = Y! / ((Y-X)! * X!)

X!在哪里X! factorial(X)

现在,我将通过一个示例展示下一部分,如何计算smaller(A) A = 010010100

首先,计算右边的0(2)。 有然后count(1, 2)下面的数字A其中最右边的1比特被移动到右侧( 010010010010010001 )。

提示:使用count = Integer.numberOfTrailingZeros(A)

删除该1位,剩下A = 010010000

提示:使用A = A ^ (1 << count)

重复,即计数0(4),但是这次我们需要计数2位组合,即count(2, 4)

A = 010000000 ,这导致count(3, 7) A = 010000000 count(3, 7)

因此,由于1位分别位于第2、4和7位,我们可以计算出:

smaller(A) = count(1, 2) + count(2, 4) + count(3, 7)

现在,有了count(X, Y)高效实现,即使对于高位数,也可以计算A和C之间的数字计数。

无论如何,这是做到这一点的一种方法,但是数学方面的天才可能对此有更好的算法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM