Java源碼解釋之Integer.bitCount

來源:互聯網
上載者:User

標籤:height   ima   http   1的個數   www   bit   element   figure   frame   

Java中的Integer.bitCount(i)的傳回值是i的二進位表示中1的個數。源碼如下:

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;}

 

源碼解析如下:

public static int bitCount(int i) {        // HD, Figure 5-2        /**         * 每兩位為一個單元,把原來單元中1的個數儲存在原來的單元中         */        i = i - ((i >>> 1) & 0x55555555);        /**         *0x33333333其實就是二進位……00110011(共32位),因為上面的每兩位代表1的個數,所以下面的這幾行就是要把上面每兩位         * 的數字加起來,下面的這行代碼可以這樣理解,每4位分為一組,然後4位中的每兩位相加,相加的結果在儲存到這4位位元中,         * i & 0x33333333表示每4位中的低2位,(i >>> 2) & 0x33333333表示每4位中的高2位,然後在相加         */        i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);        /**         * 這個更好理解,i >>> 4表示往右移動了4位,然後在與i相加,相當於每8位一組,然後8位中的高4位與低4位相加儲存在低4位中,         * 然後這裡在與0x0f0f0f0f進行與運算,把高4位完全置為0了,因為0x0f0f0f0f用二進位表示就是00001111000011110000111100001111,         * 看到這裡可能有些困惑,這裡為什麼要與0x0f0f0f0f進行與運算,因為每8位一組的話,最多也就是8,那麼4位元足夠了,高4位就沒有必要了,         * 如果不置為0有沒有影響,其實如果1的位元極少的話是沒什麼影響的,但如果1的位元比較多到後面計算的結果可能就會往前進位,導致結果錯誤,         * 所以這一步要進行一次與運算,那為什麼上面的那行代碼沒有把4位一組中的高兩位置0,這是因為4位一組最多有4個1,而2位位元最多表示3,         * 小於4,所以不能置為0,         *         */        i = (i + (i >>> 4)) & 0x0f0f0f0f;        /**         * 和上面類似,每16位分為一組,每組中的高8位和低8位相加,這裡的代碼相加的很乾淨,因為無論是高8位還是低8位中的前4位在上面一行中         * 都已經置為0了,這裡也可以像上面那樣,加完之後在與0x00ff00ff進行與運算,但其實這裡已經沒有必要了,因為int類型為32位,         * 最多也就32個1,用8位元儲存足夠了,所以不會超過8位,也就不用擔心超過8位在往前進1位的問題了。         */        i = i + (i >>> 8);        /**         * 和上面類似,就不在詳述         */        i = i + (i >>> 16);        /**         * 到最後為什麼要和0x3f進行與運算,0x3f用二進位表示就是111111,因為上面兩行沒有進行與運算,所以前面的資料都是無效的,         * 只有最後8位是有效,而後8位的前兩位不用說肯定為0,因為最多也就32個1,用後面6位元表示就已經足夠了,所以這裡與0x3f         * 進行與運算,來計算出最終1的個數         */        return i & 0x3f;}

i=031bi

Java源碼解釋之Integer.bitCount

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.