题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
分析
- 解法一:python对整数二进制表示,由于它自身语言的特殊性,对负数的二进制表示也是比较特殊的。
>>> bin(5)
'0b101'
>>> bin(-5)
'-0b101'
>>> bin(-5 & 1)
'0b1'
>>> bin(-5 & 3)
'0b11'
>>> bin(-5 & 7)
'0b11'
>>> bin(-5 & 15)
'0b1011'
>>> 1<<80
1208925819614629174706176
可以看出python对负数的二进制表示结合符号
进行表示,但是负数进行位运算时,如上面所示,根据大数的二进制位数
对负数进行补码表示
进行运算。
从最后一条测试代码
也可以看出python大数没有溢出
。
- 解法二:根据这条结论可知:对于
数值n
,将n - 1后再和n相与
,得到的值相当于将n从右边数的第一个1变成0
。n的二进制表示中有多少个1,就能变多少次。实现代码如下,时间复杂度优化为O(n中1的个数)
。
但是python语言的特殊性,负数的补码的表示没有溢出,因此利用C语言编程。
代码
# -*- coding:utf-8 -*-
class Solution:
def NumberOf1(self, n):
# write code here
return bin(((1 << 32) - 1) & n).count('1')
class Solution {
public:
int NumberOf1(int n) {
int count = 0;
while (n!=0){
count += 1;
n = n & (n-1);
}
return count;
}
};