8

C++ を使用している場合long long x;、数値の各ビットをループしてゼロか 1 かを確認するにはどうすればよいですか?

ビット内の 1 の数を数えたいと思います。

4

4 に答える 4

14

>>シフト演算子を使用する必要があります:

unsigned long long x = static_cast<unsigned long long>(your_value);
//unsigned long long fix for issue pointed out by @Zac Howland in comments
unsigned int count = 0;//number of 1 bits
while (x != 0)
{
    unsigned long long bit = x & 1;
    if( bit == 1 )
    {
        count ++;//...
    }
    else //zero
    {
        //...
    }
    x >>= 1;
}

さまざまな方法でこれを行う方法は他にもあります。ここで見つけることができます(他のものと一緒に)

于 2013-11-18T18:18:50.723 に答える
0
const unsigned int BITCOUNT = sizeof(long long) * CHAR_BIT - 1;
// or
const unsigned int BITCOUNT = sizeof(unsigned long long) * CHAR_BIT;

for (unsigned int i = 0; i < BITCOUNT; ++i)
{
    unsigned int test_bit = 1LL << i;
    if (value & test_bit)
    {
        // do something
    }
}

ビット数だけが必要な場合は、SWAR アルゴリズムを使用できます。

unsigned int bit_count(unsigned long long i)
{
    i = i - ((i >> 1) & 0x5555555555555555);
    i = (i & 0x3333333333333333) + ((i >> 2) & 0x3333333333333333);
    return (((i + (i >> 4)) & 0x0F0F0F0F0F0F0F0F) * 0x0101010101010101) >> 56;
}
于 2013-11-18T18:20:21.813 に答える