力扣面试150题--位1的个数
Day 90
题目描述
思路
初次思路:采取二进制的性质来做
class Solution {public int hammingWeight(int n) {int sum=0;int x=2;while(n>0){if(n%2!=0){sum++;}n=n/2;}return sum;}
}
位运算做法:逐步检查每个位是否为1 取32因为整型二进制最大长度为32
class Solution {public int hammingWeight(int n) {int sum=0;for(int i=0;i<32;i++){if((n&(1<<i))!=0){sum++;}}return sum;}
}
优化做法:想不到,但是很优秀
对于一个二进制数执行
n-1,最右边的1和它的右边所有0都会取反,其余位不会变化
(n-1)&n的效果,就是将最右边的1转化为0,其余位保持不变
不断循环就会使最低位1变为0,同时被记录
public class Solution {public int hammingWeight(int n) {int ret = 0;while (n != 0) {n &= n - 1;ret++;}return ret;}
}