2023每日刷题(二十七)
Leetcode—191.位1的个数
实现代码
int hammingWeight(uint32_t n) {int ans = 0;for(int i = 0; i < 32; i++) {if(n & ((long long)1 << i)) {ans++;}}return ans;
}
运行结果
翻转比特1思路
就解法一的代码实现来说,针对任意的整数,都要执行32次的移位和与操作,如果整数比较小,比如7(用二进制表示为0x1011),不仅最低的4位需要进行移位和按位与操作,其他位也要继续进行同样的位操作,但这些操作是冗余的,是可以优化的。
优化上面的算法,使其更简单,速度更快。不去检测整数的每一位,而是依次将最低位且值为1的比特位翻转为0,并增加计数器。当执行结果使整数为0时,该整数不再包含任何为1的比特,返回计数器的值。
此时的关键问题是如何执行“翻转最低有效比特为1的比特为0”,此处可以使用n &(n-1)的操作。
如上图所示,在整数n的二进制码中,最低有效比特为1的位置,在对应的n-1中,该位置总是0,因此执行与操作时会将该比特的1翻转为0,并且不会改变其他比特的值。
减少重复操作实现代码
int hammingWeight(uint32_t n) {int ans = 0;while(n) {ans++;n &= (n - 1);}return ans;
}
运行结果
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!