0

私が持っている場合、それがバイナリint i = 15;であることはわかっていますが0x00 00 00 0F、バイナリに0000 0000 0000 0000 0000 0000 0000 1111は4があり1ます。

1int 変数の合計をカウントしたい。

私はこれを書きます:

int count1(int i)
{
    int j = 0,num = 0;
    for(;j<32;j++)
        if((i<<j )&0x80000000)
            num++;
    return num;
}

動作しますが、遅すぎると思います。つまり、何百万ものintデータがあるかもしれません。これを行うためのより効果的な方法を誰かが持っていますか?

4

4 に答える 4

2
int countSetBits(int n)
{
    unsigned int count = 0;
    while (n)
    {
      n &= (n-1) ;
      count++;
    }
    return count;
}

設定されたビット数をカウントするこの方法は、Brian Kernighan のアルゴリズムと呼ばれ、設定されたビット数までループが繰り返されます。つまり、例の場合、これは 4 回だけループし、32 回ループする必要はありません。

于 2013-08-20T05:14:15.107 に答える
1
int main() 
{ 

    int number = 15; 
    int sum; // total bits set in number
    for (sum = 0; number; sum++)
    {
      number &= number - 1; 
    }
    cout<<sum<<endl;
} 
于 2013-08-20T04:53:42.160 に答える
0

これはうまくいくはずです:

int countOnes (int i) {

    int num = 0;
    while (i) {
        if (i % 2)
            num++;
        i = i >> 1;
    }

    return num;
}
于 2013-08-20T04:53:17.973 に答える
0

単純に数を減らし続けることができます。2 進数が int 変数 bin に格納されていると仮定します。

//この関数はバイナリ値を受け入れて、その中に何個あるかをカウントします。

int count(int bin)
{
    int num=0;
    while(bin>=1)
    {
        if(bin%10 == 1)
        {
            num++;
        }
        bin=bin/10;
    }
    return num;
}
于 2013-08-20T04:53:53.803 に答える