二进制中1的个数
题目:请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
来源:力扣(LeetCode)
法一
看到这道题首先想到的是之前做的剑指offer第五题,替换空挡。首先我想先把数字转换为String形式,用到了valueof(),但是却显示错误,后来我发现是我没有读懂题目,题目要求的是输入一个整数,把整数转化为二进制数后计算“1”的数量,如果输入32个十进制数字就超过了范围。错误代码如下:
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
String s=String.valueOf(n);
int res=0;
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='1'){
res++;
}
}
return res;
}
}
所以要把十进制数字转化为二进制数字,用到了Integer类型中的toBinaryString(int i)方法,问题得到解决。代码如下:
代码
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
String s=Integer.toBinaryString(n);
int res=0;
for(int i=0;i<s.length();i++){
if (s.charAt(i) == '1' ){
res ++;
}
}
return res;
}
}
法二 位运算
代码
public class Solution {
public int hammingWeight(int n) {
int res = 0;
while(n != 0) {
res += n & 1;
n >>>= 1;
}
return res;
}
}
作者:jyd
总结
利用与运算,若 n & 1 = 0,则 n 二进制最右一位为0;若 n & 1 = 1 ,则 n 二进制最右一位为1 。同时利用“>>>”进行无符号右移。
法三.n&(n−1)
思想
(n−1) :二进制数字n最右边的1变成 0,此1右边的0都变成1。
n & (n - 1)解析:二进制数字n最右边的1变成0,其余不变。
代码
public class Solution {
public int hammingWeight(int n) {
int res = 0;
while(n != 0) {
res++;
n &= n - 1;
}
return res;
}
}
作者:jyd