常見演算法之4 正整數二進位制表示中的1的個數

2022-03-14 17:22:47 字數 911 閱讀 8977

題目:輸出乙個正整數的二進位制中1的個數。

示例:10(二進位制為1010),則輸出2

方案一:

基本思想:使用除法,不斷除以2,記錄餘數為1時的次數。

**:

while(i!=0)

方案二:

基本思想:使用位運算(效率上高於方案一),通過不斷的右移,記錄最右位為1的次數。

**:

while(i!=0)

注意:若輸入為負數的時候,會導致死迴圈。

方案三:

基本思想:乙個數的二進位制減去1之後,會發生這樣的改變:從最右邊的1開始到最後,所有位都會變反,而其他的位不變。將兩者進行&運算後,從原來最右邊的1開始就都變成了0。那麼,有多少個1,就有多少次這樣的運算。

例:(以下都是二進位制表示)

1100-1=1011,1100&1011=1000

1000-1=0111,  1000&0111=0000 

一共進行了兩次這樣的運算(原始數中有兩個1)

**:

while(i!=0)

擴充套件:如何判斷乙個數是2的正次冪?

通過上面,我們發現,2的正次冪的二進位制表示中只有乙個1。

那麼若n&(n-1)為0,則n就是2的正次冪。

整數的二進位制表示

目錄總結 整數的二進位制表示,需要區分正整數和負整數來看。看正整數的二進位制表示,就要先了解一下位權。十進位制 二進位制都有位權。以 123 為例 123 1 10 2 2 10 1 3 10 0。每個位置的位權都不一樣,十進位制從右到左,以 1 開始,依次乘 10 也就是說第 1 位為 1 第 2...

LintCode 二進位制表示

給定乙個數將其轉換為二進位制 均用字串表示 如果這個數的小數部分不能在 32 個字元之內來精確地表示,則返回 error 樣例 n 3.72 返回 error n 3.5 返回 11.1 題目很簡單,直接上 吧 public class binaryrepresention return res.r...

LintCode 二進位制表示

給定乙個數將其轉換為二進位制 均用字串表示 如果這個數的小數部分不能在 32 個字元之內來精確地表示,則返回 error 您在真實的面試中是否遇到過這個題?yes 樣例n 3.72 返回 error n 3.5 返回 11.1 好久沒做題 有點懵逼 根據資料試出來的 臥槽 public class ...