設計演算法計算出二進位制數中1的個數

2021-10-18 07:18:47 字數 939 閱讀 6138

相信不少人都被問到過:如何設計乙個簡單的程式來判斷乙個二進位制數中1的個數有多少。問題雖簡單但卻有不同的解決方法,我自己發現了兩種比較常規的方法,並記錄於此

這種方法相信很多人只要稍加思索就可以想到,要想知道乙個二進位制數有多少個1,只要我們進行簡單的位操作,找出每一位具體是多少這樣,將1加到一起就能夠算出二進位制數中有多少個1,**如下

int

count_bit

(unsigned

char number)

}return count;

}

以上**我以8位數為例,當然這裡的形參也可以換成更大的數

下面這種方法相比上面一位一位的判斷就要快速的多了,我們剛剛的思路是必須把所有位的數都判斷出來才能確定1的個數,那麼有沒有一種方法可以不用判斷二進位制數中0的個數而直接定位1的個數的呢?

int

count_bit1

(unsigned

char number)

return i;

}

現在我們來分析一下為什麼上面的**要快速的多。普通的方法我們採用移位加迴圈的方法當然最終是能夠得到1的個數的但是他就需要我們一位一位的移,這未免也太繁瑣了,正如我注釋中寫道,這種操作每次能夠消除數字中最低的1,每消除一次計數就加一次,最終返回的值就是1的個數

那麼為什麼這個**可以清除最低為的1呢?

舉個例子:8(1000) = 7(0111) + 1(0001),8 (1000)& 7(0111) = 0(0000)就相當於清除了最低位的乙個1,也是唯一的乙個1。

這樣我們迴圈的次數就取決於二進位制數中1的個數,大大減少了迴圈的次數,顯然這種方法是更快速的。

我們寫**不能只考慮功能的實現,更應該考慮**的時間複雜度,盡可能的減少迴圈的次數。小小的乙個尋找二進位制中1的個數的函式都內有乾坤,看來**能力還是需要不斷的鑽研的

演算法學習 計算出二進位制數中1的個數

問題描述 計算出二進位制數中1的個數。解法與分析 使用乙個數1來 與 二進位制數中每一位,若值為1則1的個數加一。通過flag左移做乙個迴圈來與num的每一位,若與計算的結果不為0,則1的個數 param num return public static intcalc2 int num flag ...

計算二進位制數中1的個數

本文提供了三種方法,分別計算乙個數的二進位制表示中1的個數。方法和解釋分別見count1,count2,count3函式。只有count1不能滿足負數要求 會死迴圈進去 其他兩個都可以操作32b以內正負數。count1 每次將x末位與1相與,看最後以為是否為1,然後將x右移 count2 將變數y從...

計算二進位制中的1

如果乙個整數不為0,那麼這個整數至少有一位是1。如果我們把這個整數減1,那麼原來處在整數最右邊的1就會變為0,原來在1後面的所有的0都會變成1 如果最右邊的1後面還有0的話 其餘所有位將不會受到影響。舉個例子 乙個二進位制數1100,從右邊數起第三位是處於最右邊的乙個1。減去1後,第三位變成0,它後...