見到計算二進位制數中的1的個數的比較精巧的做法,做個筆記(其實是之前被問到了,所以就查了下…)
int
countones
(int n)
return count;
}
剛看見時不太明白思路,然後自己拿筆隨便划拉了下,算是搞明白了思路,簡單總結一下。這個方法的主要思想就是找到當前數字中最靠右的1。
思路簡單總結:
n - 1(n不為0時)會使得n的最右側第乙個1以及該位的右側的所有位取反,此時進行與操作,就會將該位置為0。
其實看上面那句話就行了,思路很簡單,完全理解不了思路才需要看下面的:
大致上可以分成兩種情況,當然事實上可以看成是同一種情況:
第一種:n的最右邊是1。如果n最右邊是1的話,n-1就只有最右邊那一位變為0,此時n & (n - 1)就相當於是把n中右邊第一位的1拿掉,比如n為0111時,n - 1就是0110,兩者相與,結果就是n - 1,此時n - 1中1的個數比n中少1,且最右側的位為0,已經轉變為第二種情況。
第二種:n的最右邊是0。此時計算n - 1時,需要向上借位,一直借到n的最右側的第乙個1。例如n為1000時,n - 1就是0111,此時可以發現,n的第乙個1的右側的所有位都變成了1,並且原來是1的位變成了0。注意初始時n的第乙個1的右側的所有位都是0,計算n - 1後這些位都變成了1,此時再做與操作,這些位都會變成0。所以效果就是"n的右側第乙個為1的位被置為0"。
最後當n中不存在為1的位時,n的值等於0,while迴圈退出。這種做法相對於直接從右往左靠移位和與的做法來說更好一些,不需要遍歷所有的位,也少了不少的判斷,執行時間與n中1的個數相關。
計算二進位制數中1的個數
本文提供了三種方法,分別計算乙個數的二進位制表示中1的個數。方法和解釋分別見count1,count2,count3函式。只有count1不能滿足負數要求 會死迴圈進去 其他兩個都可以操作32b以內正負數。count1 每次將x末位與1相與,看最後以為是否為1,然後將x右移 count2 將變數y從...
計算二進位制數中1的個數 C實現
程式分析 1 將原數字每次右移一位,再和1作與操作。2 將原數字與原數字減一後的值作與操作。c 第一種 define crt secure no warnings include intmain printf the count of number is d n count return0 第二種 ...
二進位制 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。示例 1 輸入 00000000000000000000000000001011 輸出 3 解釋 輸入的二進位制串 0000000...