本文最后更新于:星期二, 八月 2日 2022, 9:32 晚上

二进制中1的个数的两种计算方法

第一种解法,n &= (n - 1);这一句消灭了二进制末尾的1。循环次数与二进制中1的个数相同。

int hammingWeight(uint32_t n) {
    int count = 0;
    while (n != 0) {
        n &= (n - 1);
        ++count;
    }
    return count;
}

第二种解法,是把性能挖掘到极致的解法:

size_t hammingWeight(uint64_t V) {
    V -= ((V >> 1) & 0x5555555555555555); // 010101010101
    V = (V & 0x3333333333333333) + ((V >> 2) & 0x3333333333333333);
    return ((V + (V >> 4) & 0xF0F0F0F0F0F0F0F) * 0x101010101010101) >> 56;
}

只依靠位运算,不进行条件判断,方便并行计算。


notes      leetcode binary

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!