簡體   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