swift求無符號整數二進制中 1 的個數

求無符號整數二進制中 1 的個數??

思路:看一個八位整數 10 100 001 ,先判斷最後一位是否爲 1 ,而“與”操作可以達到目的。可以把這個八位的數字與 00000001進行“”操作。如果結果爲 1 ,則表示當前八位數的最後一位爲 1 ,否則爲 0 。怎麼判斷第二位呢?向右移位,再延續前面的判斷即可。


func numsOfones(num: UInt) -> UInt {
    
    var count : UInt = 0
    
    var tempp = num
    
    while tempp != 0 {
        count += tempp & 1
        tempp = tempp >> 1
    }
    
   return count
}


numsOfones(num: 7)

//  3

思考: 如果整數的二進制中有較多的 0 ,那麼我們每一次右移一位做判斷會很浪費,怎麼改進前面的算法呢?有沒有辦法讓算法的複雜度只與“1”的個數有關?

爲了簡化這個問題,我們考慮只有高位有 1 的情況。例如:11 000 000 ,如何跳過前面低位的 6 個 0 ,而直接判斷第七位的 1 ?我們可以設計 11 000 000 和 10 111 111(也就是 11 000 000 - 1)做“與”操作,消去最低位的 1 。如果得到的結果爲 0 ,說明我們已經找到/消去裏面最後一個 1 。如果不爲 0 ,那麼說明我們消去了最低位的 1 ,但是二進制中還有其他的 1 , 我們的計數器需要加 1 ,然後繼續上面的操作。

func numsOfones(num: UInt) -> UInt {
    
    var count : UInt = 0
    
    var tempp = num
    
    while tempp != 0 {
        count += 1
        tempp = tempp & (tempp - 1)
    }
    
   return count
}


numsOfones(num: 0x101011)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章