近乎O(1)求二进制数中1的个数
以前一直在用很普通的方式求二进制中1的个数
1 int run(int n){ 2 int cnt; 3 while(n>0){ 4 n=n&(n-1); 5 cnt++; 6 } 7 }
啊我好菜啊
发现大佬都用一种奇奇怪怪的算法 O(1)就解决了这种问题
int bsrun(int n){ int tmp=n - ((n>>1) &033333333333)-((n>>2) &011111111111); return((tmp+(tmp>>3)) &030707070707) %63; }
为什么?
我也不懂鸭。。。