191.ビット1の数
関数を記述します。入力は符号なし整数(バイナリ文字列の形式)であり、桁が「1」(ハミング重みとも呼ばれます)であるバイナリ式の桁数を返します。
促す:
一部の言語(Javaなど)では、符号なし整数型がないことに注意してください。この場合、入力と出力の両方が符号付き整数型として指定され、整数が符号付きか符号なしかに関係なく内部バイナリ表現が同じであるため、実装に影響を与えることはありません。
Javaでは、コンパイラは2の補数表記を使用して符号付き整数を表します。したがって、上記の例3では、入力は符号付き整数-3を表します。
示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
示例 2:
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
示例 3:
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。
提示:
输入必须是长度为 32 的 二进制串 。
回答:
10進数の2進数の定義によれば、10進数を2で連続的に除算するだけで、余りが0または1になるたびに、10進数が0になるまで、すべての余りを後ろから前に並べます。今回は2進数になります。
そして、必要なのは1の数なので、1の数を取得するには、毎回余りを追加するだけで済みます。これは、余りが0であっても、1の計算に影響を与えないためです。
コード:
int hammingWeight(uint32_t n) {
int m = 0;
while(n)
{
m += n%2;
n/=2;//也可以由位运算写成n=n>>1
}
return m;
}
方法2:ビット演算
計算にはビット演算を直接使用できます。
ビット単位のANDの概念に基づいて、毎回n対1のビット単位のANDを実行できます。このように、nの最後のビットが1の場合、結果も1になり、 nは0です。1は取得されません。次に、毎回nを2で除算します。つまり、1ビットを右にシフトします。
つまり、バイナリの最下位ビットが毎回1であるかどうかが直接判断されます。
//直接判断二进制最低位的数是不是1
int hammingWeight(uint32_t n) {
int m = 0;
while(n)
{
m+=n&1;
n>>1;
}
return m;
}