二進位制中1的個數 二進位制中0的個數

2021-06-22 12:23:07 字數 1237 閱讀 1589

1、題目:

實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數,例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。

2、解法

解法

一、可能會引起死迴圈的解法

基本思路:先判斷整數二進位制表示中最右邊一位是不是1。接著把輸入的整數右移一位,此時原理處於從右邊數起的第二位被移到 最右邊,再判斷是不是1。這樣每次移到一位,直到整個整數變成0為止。

int numbetof1(int n)

return count;

}

問題1:把整數右移一位和把整數除以2在數學上是等價的,那上面的**可以把右移運算換成除以2嗎?

答:不可以,因為除法的效率比移位運算要低很多,實際程式設計中應盡可能地用移位運算子代替乘除法。

問題2:如果輸入乙個負數,如0x80000000,執行的時候會發生什麼情況?

答:會陷入死迴圈。由於把負數0x80000000右移一位的時候,並不是簡單地把最高位的1移到第二位變成ox40000000,而是oxc0000000。這是因為移位前是個負數,仍然要保證移位後是個負數,因此移位後的最高位會設為1。如果一直做右移運算,最終這個數字就會變成oxffffffff而陷入死迴圈。

解法

二、常規解法

為了避免死迴圈,我們可以不右移輸入的數字i。首先把i和1做與運算,判斷i的最低位是不是1。接著把1左移一位得到2,再和i做與運算,就能判斷i的次低位是不是1...這樣反覆左移,每次都能判斷i的其中一位是不是1。

int numberof1(int n)

return count;

}

這種解法迴圈的次數等於整數二進位制的位數,32位的整數需要迴圈32次。

解法

三、更高效的解法

分析思路:我們發現把乙個整數減去1,都是把最右邊的1變成0。如果它的右邊還有0的話,所有0都變成1,而它左邊所有位都保持不變。接下來把乙個整數和它減去1的結果做位與運算,相當於把它最右邊的1變成0.

以1100為例,它減去1的結果是1011.再把1100和1011做位與運算,得到的結果是1000.這樣對於乙個整數我們能進行多少次這樣的操作,就表示這個整數中有多少個1.

int numberof1(int n)

return count;

}

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

題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。示例 1 輸入 00000000000000000000000000001011 輸出 3 解釋 輸入的二進位制串 0000000...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

二進位制中1的個數

這種方法速度比較快,其運算次數與輸入n的大小無關,只與n中1的個數有關。如果n的二進位制表示中有k個1,那麼這個方法只需要迴圈k次即可。其原理是不斷清除n的二進位制表示中最右邊的1或者最左邊的1,同時累加計數器,直至n為0 如7 0111 通過與 7 1 0110 與操作消去最最左邊的1,並累加計數...