1.説明
関数を記述します。入力は符号なし整数で、「1」(ハミング重みとも呼ばれます)のバイナリ式の桁数を返します。
2.例
入力:00000000000000000000000000001011
出力:3
説明:入力バイナリストリング00000000000000000000000000001011では、合計3ビットが「1」です。
入力:00000000000000000000000010000000
出力:1
説明:入力バイナリストリング00000000000000000000000010000000では、合計1ビットが「1」です。
入力:11111111111111111111111111111101
出力:31
説明:入力バイナリストリング11111111111111111111111111111101では、合計31ビットが「1」です。
促す
- 一部の言語(Javaなど)では、符号なし整数型がないことに注意してください。この場合、入力と出力の両方が符号付き整数型として指定され、実装に影響を与えることはありません。整数が符号付きか符号なしかに関係なく、内部のバイナリ表現は同じであるためです。
- Javaでは、コンパイラーは2の補数表記を使用して符号付き整数を表します。したがって、上記の例3では、入力は符号付き整数-3を表します。
3.分析
正の整数は3で、そのバイナリ表現は "0000 0011"です。次の表に示すように、3に対して3&(3-1)演算を実行します。
オペレーティング | 整数表現 | バイナリ表現 |
---|---|---|
3 | 0000 0011 | |
& | 3 -1 = 2 | 0000 0010 |
= | 2 | 0000 0010 |
3&(3-1)の結果2に対して2&(2-1)演算を続行します。
オペレーティング | 整数表現 | バイナリ表現 |
---|---|---|
2 | 0000 0010 | |
& | 2 -1 = 1 | 0000 0001 |
= | 0 | 0000 0000 |
上記の2つのテーブルを観察すると、予備的な結論を導き出すことができます。3のバイナリ表現には2 1があり、2&演算の後、結果は0になります。
負の数の別の例を見てみましょう。
負の数は(-125)で、その2進数表現は「1000 0011」です。
(-125)で(-125)&(-125-1)操作を実行します。プロセスは次の表に示されています。
オペレーティング | 整数表現 | バイナリ表現 |
---|---|---|
-125 | 1000 0011 | |
& | -125-1 = -126 | 1000 0010 |
= | -126 | 1000 0010 |
(-125)&(-125-1)の結果(-126)に対して&処理を続行します。プロセスは次の表に示されています。
オペレーティング | 整数表現 | バイナリ表現 |
---|---|---|
-126 | 1000 0010 | |
& | -126-1 = -127 | 1000 0001 |
= | -128 | (1)1000 0000 |
(-126)&(-126-1)の結果(-128)に対して&操作を続行します。プロセスは次の表に示されています。
オペレーティング | 整数表現 | バイナリ表現 |
---|---|---|
-128 | (1)1000 0000 | |
& | -128-1 = -129 | (1)0111 1111 |
= | 0 | 0000 0000 |
これらの3つのテーブルを観察すると、結論を出すこともできます:(-125)バイナリには3 1があります。3&演算の後、結果は0になります。
結論:
整数nnnのバイナリストリング内の1の数、nnと等しいn&(nnn -1)操作の数。
4.コード
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int numOneBits = 0;
while(n != 0)
{
n = n & (n - 1);
++numOneBits;
}
return numOneBits;
}
}
しかし、より単純なコードがあります:
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
return Integer.bitCount(n);
}
}
5.検証
6.ソース
- LeetCode 191.ビット数1
出典:LeetCode
リンク:https ://leetcode-cn.com/problems/number-of-1-bits
著作権はLeetcode Networkが所有しています。