近乎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;
}
DALAO版

为什么?

我也不懂鸭。。。

posted @ 2019-10-04 15:45  _loverr  阅读(424)  评论(0编辑  收藏  举报
Live2D