求乙個數字二進位制中 1 的個數

2021-10-20 20:04:27 字數 1617 閱讀 9189

任意給定乙個 32 位無符號的整數 n,計算 n 的二進位制表示中 1 的個數,比如 n = 3(011))時,返回 2

通過移位解決,每次向右移一位( >> 1),然後判斷最後一位是不是 1(&1),最多迴圈 32 次

int bitcount(unsigned int n)

n = n >> 1;

} return count;

}

使用下面的測試用例計算一下時間

int main(void) 

std::chrono::high_resolution_clock::time_point end = std::chrono::high_resolution_clock::now();

std::chrono::durationtime_span = end - start;

std::cout << "time:" << time_span.count() << std::endl;

getchar();

return 0;

}

時間列印是:time:0.0012

這種方法速度比較快,運算次數與 n 中 1 的個數有關,每次不斷的清除 n 二進位制中最右邊的 1,同時累加計數器,一直到 n 為 0,一般筆試面試給出這種解法也就可以了

int bitcount(unsigned int n)

return count;

}

時間列印是:time:0.0005

最常見的就是這兩種辦法了,尤其是第二種在面試的時候是很喜歡問的

可以看一下 leetcode 這一道題目:用於求乙個連續集合內,所有數字二進位制種 1 的個數

要求實現 vectorcountbits(int num) 函式

這裡運用乙個比較巧妙的思想,對於乙個正整數 n

1、如果 n 是偶數,那麼 n 二進位制的個數與 n / 2 中二進位制的格式都是一樣的,比如 2,4,8,16,32,64,他們都只有乙個 1,再比如 6 和 3 的二進位制都是 2 個 1,因為 n 是由 n/2 左移一位過來的,左移是在結尾補 0,所以 1 的個數並不會增加

2、如果 n 是奇數,那麼 n 的二進位制個數是 n / 2 中二進位制個數 +1,因為 n 是奇數時,相當於 n / 2 左移再加 1

基於上面的思路,我們實現以下 vectorcountbits(int num) 函式

vectorcountbits(int num) ;

std::vectorresult;

result.push_back(0);

for (int i = 1; i <= num; ++i)

result.push_back(bits[i]);

}if (result.size() == num + 1)

for (int i = 4; i <= num; ++i)

result.push_back(count);

} return result;

}

利用了空間來換取時

C語言 求乙個數字的二進位制中 1 的個數

寫乙個程式列印指定數字的二進位制中 1 的個數,比如 15 0000 1111 輸出4 下面是三種方式 通過模2除2 2 2 的方法 num 2 取出二進位制的最後一位 num 2 右移去掉二進位制的最後一位 通過while迴圈,依次取出二進位制的最後一位數字判斷是否為1,若為1則count whi...

二進位制 求乙個數的二進位制表示中1的個數

題目 求乙個正整數x中1的個數 思考 二進位制是乙個01串。統計該串中1的個數。方法1 將x按照樸素的方法轉化成二進位制串,如果x的某二進位制位上為1,則res 求得最後x中1的個數。int x while x return res res即是x的二進位制數中1的個數用這種方法求,時間複雜度為o n...

求二進位制中1的個數

在 程式設計之美 一書中有一節提到如何求乙個位元組的無符號整型變數二進位制表示中中1的個數,主要提到了四種方法。下面簡單介紹一下 1.求餘法 在將十進位制數轉換為二進位制數時,採用除2取餘法。將每次除2得到的餘數儲存起來逆序輸出便是該十進位制整數的二進位制表示。因此可以採用這種方法去統計1的個數。i...