簡體   English   中英

按位-bitCount的公式含義是什么?

[英]Bitwise - bitCount's formula meaning?

這是Integer.bitCount(int i)中代碼的副本

我了解所有運算符,但不了解這些魔術數字如何找出計數! 誰能向我解釋? 我可以看到模式(1,2,4,8,16&0x5,0x3,0x0f)。

        public static int bitCount(int i) {
            // HD, Figure 5-2
            i = i - ((i >>> 1) & 0x55555555);
            i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
            i = (i + (i >>> 4)) & 0x0f0f0f0f;
            i = i + (i >>> 8);
            i = i + (i >>> 16);
            return i & 0x3f;
        }

好的,您的代碼是32位整數,但由於字母表沒有32個字母,因此讓我們找出第一步是16位。 假設輸入的二進制形式(字節邊界由空格表示)為

i                  = ABCDEFGH IJKLMNOP
i >>> 1            = 0ABCDEFG HIJKLMNO
(i >>> 1) & 0x5555 = 0A0C0E0G 0I0K0M0O

因此,第一個分配中右側的前兩位是(AB - 0A) 嘗試組合:

A  B  AB-0A
0  0  00-00 = 00
1  0  10-01 = 01
0  1  01-00 = 01
1  1  11-01 = 10

這樣結果的前兩位給你位的計數輸入的前兩位。 所有其他兩個兩位的組也一樣。

現在,您再次執行相同的操作。 這次我們將考慮以4為底的輸入,因此兩位由下面的符號組成,我們可以使用完整的32位。

i                      = ABCD EFGH IJKL MNOP
i & 0x33333333         = 0B0D 0F0H 0J0L 0N0P
i >>> 2                = 0ABC DEFG HIJK LMNO
(i >>> 2) & 0x33333333 = 0A0C 0E0G 0I0K 0M0O

因此,結果的前四位是(0A + 0B) = A + B ,其他四位組也是如此。 因此,在這一點上,每組四位包含原始輸入中這四位的位數。

使用基數16,下一步是

i                            = AB CD EF GH
i >>> 4                      = 0A BC DE FG
i + (i >>> 4)                = A(A+B) (B+C)(C+D) (D+E)(E+F) (F+G)(G+H)
(i + (i >>> 4)) & 0x0f0f0f0f = 0(A+B) 0(C+D) 0(E+F) 0(G+H)

之所以可行,是因為每個四位組中的位計數始終小於4,因此可以將兩個這樣的計數相加,就可以用四位表示,而不會發生溢出。 因此,加法運算不會從一個四位的基數16位到另一位溢出。 此時,每個字節都包含輸入字節的位數。 其他算法也可以使用聰明的乘法從那里進行轉換,但是您引用的代碼對於后續步驟也同樣適用。

i                           = A B C D
i >>> 8                     = 0 A B C
i2 = i + (i >>> 8)          = A (A+B) (B+C) (C+D)
i2 >>> 16                   = 0 0 A (A+B)
i3 = i2 + (i2 >>> 1         = A (A+B) (A+B+C) (A+B+C+D)
i3 & 0x3f                   = 0 0 0 (A+B+C+D)

同樣,這利用了數字之間沒有溢出的事實。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM