題目描述
輸入一個整數,輸出該數二進制表示中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;
}
};