タイトル説明
進数1での出力の数を示す整数。ここで、負の数は補数を示します。
分析
- Aソリューション:独自の言語の特殊な性質のために、整数の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を見ることができます大数没有溢出
。
- 溶液II:この結論によるとが見つかりました:のために得られた値。nは1の数のバイナリ表現、あなたは多くの時間を変更することができます。次のようにコードは、時間の複雑さの最適化されています。
数值n
n - 1后再和n相与
相当于将n从右边数的第一个1变成0
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;
}
};