题目描述:
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/
请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。
我爱小河豚 发布于 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)
在线疯狂 发布于 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. 使用无符号右移操作,可以忽略符号位。
我爱小河豚 发布于 2015年3月17日 01:00 #
多谢楼主,我没考虑无符号右移操作。