2016-03-13 3 views
-2

Например, сумма (6) должна возвращать 2, так как двоичная версия 6 равна 110двоичное представление

Не уверен, что логика верна или нет.

int sum(int n) 
{ 
    int count = 0; 
    while(n) 
    { 
     count += n & 1; 
     n >>= 1; 
    } 
    return count; 
} 
int main(){ 
    int n = 9001; 
    cout << “The sum of bits for number “ << n << “is” << sum(n) << endl; 
    retun 0; 
} 
+1

В чем проблема, с которой вы сталкиваетесь? – Kevin

+1

Если вы не ищете полный ответ, который вы можете просто скопировать и вставить, я не вижу здесь никаких вопросов. Что вы пытаетесь спросить? – hvd

+0

ваш код в порядке, пока вы не введете отрицательное число ... тогда он никогда не остановится. –

ответ

-1

Если вы используете GCC как компилятор, проверка встроенную __builtin_popcount(). Он возвращает число 1 в двоичном представлении.

См. here для получения дополнительной информации.

EDIT 2: У меня было неправильное решение здесь, удалено. Спасибо за комментарии, указав это.

5

Как всегда, лучший способ решить эти проблемы - использовать стандартную библиотеку. Вы все изучили инструменты, доступные в стандартной библиотеке, не так ли?

;-)

#include <iostream> 
#include <bitset> 


template<class T> 
size_t bits_in(T t) 
{ 
    return std::bitset<sizeof(t) * 8>(t).count(); 
} 

int main() 
{ 
    using namespace std; 
    int i = 6; 

    cout << "bits in " << i << " : " << bits_in(i) << endl; 

    long l = 6353737; 
    cout << "bits in " << l << " : " << bits_in(l) << endl; 

    return 0; 
} 

ожидается выход:

bits in 6 : 2 
bits in 6353737 : 11 
3
int sum(int n) 
{ 
    int count = 0; 
    if (0 != n) 
    { 
    while(++count, n &= (n - 1)); 
    } 
    return count; 
} 

быстро, потому что это только петли один раз для каждого 1 бит.

+0

это действительно приятное решение, если вы знаете, что архитектура не имеет инструкции для подсчета бит по существу (некоторые делают). Решение 'std :: bitset' позволяет реализации использовать эти инструкции, поэтому должно быть как минимум быстрым, если не быстрее, если вы используете хорошо реализованную библиотеку. +1 для приятного эго. –

Смежные вопросы