bitcount java_java-Long.bitCount()如何找到设置的位数?
讓我們以255為例.我們將這些位組合在一起.首先,我們從255開始,為0b1111.1111(二進制為8 1)
第一行代碼是:
i = i - ((i > > > 1) & 0x5555555555555555L);
這條線正在梳理每對1.由于我們有8個1,所以我們希望組合成對,并得到2,2,2,2之類的東西.由于它是二進制文件,因此我們期望10101010.
讓我們看看我> > 1.我是0b1111.1111,并且正在向下移動1,所以我們得到0b0111.1111.我們將交集&與0b0101.0101(這是從5到101的二進制數).這樣做可以保留一半的位,特別是最初位于偶數位置的所有位(從我們的初始編號開始的第二,第四,第六,第八位).
然后,我們從初始值中減去此值,這有點麻煩.我們正在嘗試將高位添加到低位,所以我們可以這樣做:
((i > > > 1) & 0x5555) + (i & 0x5555)
左側的術語將是高位,而右側的術語將是低位.但是我們知道i = 2 *(最高位)1 *(最低位),因為最高位上移了1(與乘以2相同).因此,通過將最高位減去1次,我們得到了相同的結果.
好的,現在我們可以開始第二行代碼了.當前,我有0b1010.1010,我們準備將每對2加起來.我們期望得到4,4(每半使用4位)或二進制0100.0100.代碼是:
i = (i & 0x3333333333333333L) + ((i > > > 2) & 0x3333333333333333L);
我們得到每組4個中的前2個數字,以及后2個數字,并將它們相加. 0x3333 = 0b0011.0011.0011.0011,因此我們可以看到以3表示的相交&會使組中的后2個數字保持不變.我們首先獲得底部的兩個數字,然后將i移至2個點以得出頂部的2個數字.然后我們添加:0010.0010 0010.0010 = 0100.0100.完全符合預期.
接下來,我們將2組(共4組)加在一起.
i = (i + (i > > > 4)) & 0x0f0f0f0f0f0f0f0fL;
0x0f0f = 0b0000111100001111,因此,如果我們與之相交,我們將每四個數字保留一次.我們將i加到降檔后的4,因此我們計算出0100.0100 0000.0100 = 0100.1000. 4 4應該返回8,并且8 = 0b1000,但是頂部的“ 4”仍然需要刪除.與0f0f0f0f的交集執行此操作.
因此,現在我們有0b1000,它是8.其余步驟將更高的位相加(例如2組8個一起,而不是2組16個..),但是由于我們的數字(255)只有8位長,因??此高位全為0,因此這不會影響我們的結果.
總結
以上是生活随笔為你收集整理的bitcount java_java-Long.bitCount()如何找到设置的位数?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一阶电路中的时间常数_精确移相电路的设计
- 下一篇: mysql远程一会不用卡住_连接远程My