Java LeetCode:计数1位的数目

Java LeetCode:计数1位的数目,java,bit-manipulation,bit,Java,Bit Manipulation,Bit,我试图理解为什么下面的代码不能解决这个问题 我们正在传递位(0和1)作为参数。如果我不使用位运算,而是首先将整数转换为charArray并对其进行迭代以计算“1”的编号,然后返回它,为什么它不起作用 public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int count=0;

我试图理解为什么下面的代码不能解决这个问题

我们正在传递位(0和1)作为参数。如果我不使用位运算,而是首先将整数转换为charArray并对其进行迭代以计算“1”的编号,然后返回它,为什么它不起作用

 public class Solution {
        // you need to treat n as an unsigned value
        public int hammingWeight(int n) {
             int count=0;
            for(char c:String.valueOf(n).toCharArray())
            {
                if('1'==c)
                    ++count;
            }
            
            return count;
            
        }
    }

如果要在十进制字符串中计算
1
,则可以通过
Integer.toBinaryString()将其转换为二进制字符串


我们不必将n转换为字符串,这将很好地传递:

class Solution {
    public static int hammingWeight(int n) {
        int ones = 0;
        while (n != 0) {
            ones = ones + (n & 1);
            n = n>>>1;
        }
        return ones;
    }
}


考虑到这是Java,我很惊讶没有人提到
Java.lang.Integer的JDK方法
Integer.bitCount(I)

问题说“如果我不使用位操作”,所以用位操作的解决方案回答是没有用的。“为什么它不工作?”——例如:输入是
42
,它是二进制的
101010
,因此它有三个1位,但是
字符串。valueOf(n)
返回
“42”
,其中零个字符等于
'1'
。最简单的解决方案是调用:“返回一位的数字”
class Solution {
    public static int hammingWeight(int n) {
        int ones = 0;
        while (n != 0) {
            ones = ones + (n & 1);
            n = n>>>1;
        }
        return ones;
    }
}