剣はオファー15を指します。バイナリの1の数
タイトル説明
問題解決のアイデア
サイクルとビットシフト
整数の各ビットをマスクで確認し、マスクを左にシフトし続けます。
サイクル数は、整数の2進数の数と同じです。32ビット整数は32回サイクルする必要があります。
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int bits = 0; //二进制 1 的个数
int mask = 1; //用掩码检查每一位是否为1
for (int i = 0; i < 32; i++) {
if ((n & mask) != 0) {
bits++;
}
mask <<= 1; //右移一位
}
return bits;
}
}
ビット操作のヒント
この種のソリューションは、整数バイナリに1がいくつかあり、ループする必要があるのは数回だけであることを認識できます。
整数が0でない場合、整数の2進数には少なくとも1つの1があります。この整数から1を引くと、元の右端の1は0になり、この1の右側にあるすべての0はすべて1になり、残りのすべてのビットは影響を受けません。たとえば、1100から1を引いたものは1011になります。
上記のルールを使用して、nとn-1がAND演算されると、nの右端の1が削除され、残りのビットは影響を受けません(たとえば、1100&1011 = 1000)。次に、nに1が含まれる回数だけ、このような操作が実行されます。
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int bits = 0; //二进制 1 的个数
while (n != 0) {
bits++;
n &= (n - 1);
}
return bits;
}
}