bit manipulation

    vector<int> countBits(int num) {
        //ret[i] gives # of 1 in binary representation of i
        vector<int> ret(num+1, 0);
        for (int i=0; i<=num; ++i) {
            int curr = i;
            for (int b=0; b<8*sizeof(int); ++b) {
                ret[i] += curr&1;
                curr>>=1;
            }
        }
        return ret;
    }

side note

    bool isPowOfTwo(int n) {
        return (n & (n - 1)) == 0;
    }

num/2 ===> num>>1
num%2 ===> num&1

  • [method2] observe and follow pattern: O(n)

  • 1.observe that each number append 0 or 1 gets the new number :
    e.g. 0 appends 0 =》00; 0 appends 1 =》01
    容易发现,除了11最右边那个位和5的最高位,其他位对应一样。也就是说i用二进制表示时1出现的次数等于i/2中1出现的次数加1(如果i用二进制表示时最右边一位为1,否则不加1)。这样我们在计算i时可以利用前面已计算出的i/2:ret[i] = ret[i/2] + (i % 2 == 0 ? 0 : 1);

  • 2 . OR, observe that ret[i] = ret[i&(i-1)] + 1; Recall i&(i-1)==0 when i is power of 2, meaning only has one bit 1.

    vector<int> countBits(int num) {
        vector<int> ret(num+1, 0);
        for (int i=1; i<num+1; ++i) {
            // ret[i] = ret[i/2] + i%2;
            ret[i] = ret[i>>1] + (i&1); //NOTE: add ()!!! + EXCUTES BEFORE &
            // Or
            ret[i] = ret[i&(i-1)] + 1;  (nearest power of 2)
        }
        return ret;
    }

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 11,808评论 0 33
  • 一晃又是一年到,过了二十几年的年,却已然没了儿时的欣喜与期盼。年二十九依然在上班的我们,络绎不绝的诉讼服务大厅...
    宝宝爱自由阅读 268评论 0 2
  • 很长时间前学习时遗留的草稿,一直没有整理,现在虽然看来比较简单了,但是还是想要整理发布作为记录 。 目前我知道的两...
    GYLEE阅读 80评论 0 0