剑指OFFER笔记_15_二进制中1的个数_JAVA实现
题目:二进制中1的个数
- 请实现一个函数,输入一个整数,输出该树二进制表示中1的个数。例如,把9表示成二进制是1001,有2位是1。因此,如果输入9,则该函数输出2。
解题思路
- 此题的代码思路很精巧,利用了二进制数的一些特点。
- 假如该数的二进制以1结尾,如1001。此时将其减1,则得到1000。将1001和1000进行与操作,得到的就是1000。
- 假如该数的二进制以0结尾,如1100。此时将其减1,则得到1011。此时将1100和1011进行与操作,得到的就是1000。
- 对上述两个例子观察可以得到,对一个二进制数进行减一操作,可以使其最后的一个1变为0,而这个1的右边的0全部变为1,左边的数位不变。所以将一个数n与(n-1)进行与操作,可以让其最右边的1变为0。其他数位不变。
- 利用此性质,我们可以写出如下代码
代码
函数主体部分代码
package q15;
/**
* 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。
* 例如,把9表示成二进制是1001,有2位是1。
* 因此,如果输入9,则该函数输出2。
*/
public class Solution {
public int hammingWeight(int n) {
int count = 0; //记录1的个数。
//直到n的1全部被销掉
while(n != 0)
{
count++;
n &= (n-1); //消去最右边的一个1
}
return count;
}
}
测试部分代码
package q15;
/**
* 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。
* 例如,把9表示成二进制是1001,有2位是1。
* 因此,如果输入9,则该函数输出2。
*/
public class TestApp {
public static void main(String[] args) {
Solution s = new Solution();
for (int i = 0; i < 21; i++) {
System.out.println(i + "'s number of 1 is: " + s.hammingWeight(i));
}
}
}
运行结果截图
LeetCode运行截图