[LeetCode]Number of 1 Bits

题目描述:

Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also known as the Hamming weight).

For example, the 32-bit integer ’11' has binary representation 00000000000000000000000000001011, so the function should return 3.

题目大意:

编写函数接收一个无符号整数,返回其二进制形式中包含的1的个数(也叫做汉明权重)

例如,32位整数'11'的二进制表示为:00000000000000000000000000001011,因此函数应当返回3

解题思路:

位操作(bit manipulation)

Python代码(32次右移):

class Solution:
    # @param n, an integer
    # @return an integer
    def hammingWeight(self, n):
        ans = 0
        while n:
            ans += n & 1
            n >>= 1
        return ans

另一种解法,参考:https://leetcode.com/discuss/27609/short-code-of-c-o-m-by-time-m-is-the-count-of-1s

class Solution:
    # @param n, an integer
    # @return an integer
    def hammingWeight(self, n):
        ans = 0
        while n:
            n &= n - 1
            ans += 1
        return ans

使用Java解题时,需要注意:

1. 输入值n可能为负数(但应视其为无符号整数,但Java中实际上是没有无符号整数的)

2. 使用无符号右移操作,可以忽略符号位。

Java代码:

public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int ans = 0;
        while (n != 0) {
            ans += n & 1;
            n >>>= 1;
        }
        return ans;
    }
}

 

本文链接:http://bookshadow.com/weblog/2015/03/10/leetcode-number-1-bits/
请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。

如果您喜欢这篇博文,欢迎您捐赠书影博客: ,查看支付宝二维码

Pingbacks已关闭。

评论
  1. 我爱小河豚 我爱小河豚 发布于 2015年3月16日 12:52 #

    楼主,python 解法我改成了Java不能通过leetcode
    int ans = 0;
    while (n >0)
    ans += n & 1;
    n >>= 1;
    return ans;
    会报这个错
    Last executed input: 2147483648 (10000000000000000000000000000000)

  2. 在线疯狂 在线疯狂 发布于 2015年3月16日 16:50 #

    public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
    int ans = 0;
    while (n != 0) {
    ans += n & 1;
    n >>>= 1;
    }
    return ans;
    }
    }
    参考LeetCode Discuss:https://leetcode.com/discuss/28216/accepted-java-solution-but-i-have-a-question-to-ask
    此处需要注意两点:
    1. 输入值n可能为负数(但应视其为无符号整数,但Java中实际上是没有无符号整数的)
    2. 使用无符号右移操作,可以忽略符号位。

  3. 我爱小河豚 我爱小河豚 发布于 2015年3月17日 01:00 #

    多谢楼主,我没考虑无符号右移操作。

张贴您的评论