剣はオファー15を指します。バイナリの1の数

剣はオファー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;
    }
}

おすすめ

転載: blog.csdn.net/cys975900334/article/details/114835844