本文最后更新于:星期二, 八月 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;
}
只依靠位运算,不进行条件判断,方便并行计算。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!