как зацикливаться на длинный длинный в переполнении стека

Если у меня есть long long x; в с ++

Как я могу перебрать каждый бит в числе, чтобы проверить, равен ли он нулю или 1?

Я хотел бы посчитать количество единиц в битах.

2

Решение

Вам нужно использовать сдвиг >> оператор:

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;
}

Есть другие методы, которые делают это по-разному, вы можете найти их здесь (вместе с другими вещами)

9

Другие решения

Вам не нужно делать операцию сдвига. 🙂

size_t count = 0;

for ( long long v = x; v; v &= v - 1 ) ++count;
1

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;
}
0
По вопросам рекламы [email protected]