Подсчет числа 1 бит в C++ отрицательное число

Следующая функция:

int numOnesInBinary(int number) {
    int numOnes = 0;
    while (number != 0) {
        if ((number & 1) == 1) {
            numOnes++;
        }
        number >>= 1;
    }
    return numOnes;
}

будет работать только для положительных чисел, потому что в случае отрицательного числа он всегда добавляет 1 к крайнему левому биту при выполнении операции >>. В Java мы можем использовать вместо >>>, но как мы можем сделать это в C++? Я читал в книге, что мы можем использовать целые числа без знака в C++, но я не понимаю, как целые числа без знака не могут представлять отрицательные числа.

3 ответа

В ролях number на unsigned int и рассчитывайте на это:

int numOnesInBinary(int number) {
    int numOnes = 0;
    unsigned int unumber = static_cast<unsigned int>(number);
    while (unumber != 0) {
        if ((unumber & 1) == 1) {
            numOnes++;
        }
        unumber >>= 1;
    }
    return numOnes;
}

Целое число без знака позволяет считать биты в простом цикле.

Преобразование из подписи в беззнаковое дает недействительный результат, если мы говорим о значениях:

char c = -127;
unsigned char u = (unsigned char)c; // 129

Но если мы говорим только о форме, она не меняется:

1 0 0 0 0 0 0 1 == decimal signed -127
1 0 0 0 0 0 0 1 == decimal unsigned 129

Так что приведение к неподписанному - это просто взлом.

Count представляет количество установленных битов в целом числе n, если размер целого числа составляет 32 бита, тогда

int count =0;  

int n = -25 //(given)
for(int k=0;k<32;k++){
     if ((n >> k) & 1){
        count++;
     }
}

return  count;
// How about this method, as hinted in "C Book" by K & R.
// Of course better methods are found in MIT hackmem   
// http://www.inwap.com/pdp10/hbaker/hakmem/hakmem.html  
//
int numOnesInBinary(int number) {
    int numOnes = 0;
    // Loop around and repeatedly clear the LSB by number &= (number -1).  
    for (; number; numOnes++, number &= (number -1));
    return numOnes;
}
Другие вопросы по тегам