関数を記述します。入力は符号なし整数(バイナリ文字列の形式)であり、「1」(ハミング重みとも呼ばれます)のバイナリ式の桁数を返します。
促す:
一部の言語(Javaなど)では、符号なし整数型がないことに注意してください。この場合、入力と出力の両方が符号付き整数型として指定され、整数が符号付きか符号なしかに関係なく内部バイナリ表現が同じであるため、実装に影響を与えることはありません。
Javaでは、コンパイラは2の補数表記を使用して符号付き整数を表します。したがって、上記の例3では、入力は符号付き整数-3を表します。
例1:
入力:00000000000000000000000000001011
出力:3
説明:入力バイナリー文字列00000000000000000000000000001011では、合計3ビットが「1」です。
例2:
入力:00000000000000000000000010000000
出力:1
説明:入力バイナリー文字列00000000000000000000000010000000では、合計1ビットが「1」です。
例3:
入力:11111111111111111111111111111101
出力:31
説明:入力バイナリストリング11111111111111111111111111111101では、合計31ビットが「1」です。
促す:
入力は、長さ32のバイナリ文字列である必要があります。
上級:
この関数を複数回呼び出す場合、アルゴリズムをどのように最適化しますか?
复习;
a = 0011 1100
b = 0000 1101
-----------------
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011
下面的表中列出了按位运算符,假设整数变量A=60,变量B=13,那么 -
运算符
描述
示例
&
二进制AND运算符,如果存在于两个操作数中,则它会将结果复制到结果中。
A&B的结果为:12,也就是:0000 1100
Ι
二进制OR运算符,如果存在于任一操作数中,则复制一位。
A|B 的结果为:61,也就是:0011 1101
^
二进制异或运算符,如果在一个操作数中设置但不在两个操作数中设置,则复制该位。
A^B的结果为:49,也就是:0011 0001
~
二元一元补充运算符是一元的,具有“翻转”位的效果。
~A的结果为:-61,也就是:1100 0011
<<
二进制左移运算符,左操作数值向左移动右操作数指定的位数。
A << 2的结果为:240,也就是:1111 0000
>>
二进制右移运算符,左操作数值向右移动右操作数指定的位数。
A >> 2的结果为:15,也就是:1111
>>>
右移零填充运算符。 左操作数值向右移动右操作数指定的位数,移位值用零填充。
A >>>2的结果为:15,也就是:0000 1111
代码:
public int hammingWeight(int n) {
int sum=0;
for(int i=0;i<32;i++) {
if((n>>i&1)==1) {
sum++;
}
}
return sum;
}