unsigned popcount (unsigned u)
{
u = (u & 0x55555555) + ((u >> 1) & 0x55555555);
u = (u & 0x33333333) + ((u >> 2) & 0x33333333);
u = (u & 0x0F0F0F0F) + ((u >> 4) & 0x0F0F0F0F);
u = (u & 0x00FF00FF) + ((u >> 8) & 0x00FF00FF);
u = (u & 0x0000FFFF) + ((u >> 16) & 0x0000FFFF);
return u;
}
=> 使用分治法
https://zh.wikipedia.org/wiki/%E6%B1%89%E6%98%8E%E9%87%8D%E9%87%8F
簡單來說就是先算出兩個bit裡面有幾個1
A=b'1111
(A) &(b'0101) +(A>>1)&(b'0101) =b'1010
代表第
0,1 bit 有兩個為1
2,3bit 有兩個為1
接著就是 shift跟加法的問題
ref.
http://blog.csdn.net/rappy/article/details/1788969
沒有留言:
張貼留言
有敘述錯誤或者是觀念有問題歡迎指正