程式設計之美 求二進位制中1的個數

2021-07-10 15:45:49 字數 1444 閱讀 4280

1.問題描述

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

2.分析與解法解法1:利用十進位制和二進位制相互轉化的規則,依次除餘操作的結果是否為1  **如下:

int count1(unsigned int

v) v = v/2

; }

return

num;

}

解法2:向右移位操作同樣可以達到相同的目的,唯一不同的是,移位之後如何來判斷是否有1存在。對於這個問題,舉例:10100001,在向右移位的過程中,我們會把最後一位丟棄,因此需要判斷最後一位是否為1,這個需要與00000001進行位「與」操作,看結果是否為1,如果為1,則表示當前最後八位最後一位為1,否則為0,解法**實現如下,時間複雜度為o(log2v)。

int count2(unsigned int

v)

return

num;

}

解法3:利用"與"操作,不斷清除n的二進位制表示中最右邊的1,同時累加計數器,直至n為0,這種方法速度比較快,其運算次數與輸入n的大小無關,只與n中1的個數有關。如果n的二進位制表示中有m個1,那麼這個方法只需要迴圈k次即可,所以其時間複雜度o(m),**實現如下:

int count3(unsigned int

v)

return

num;

}

程式設計之美同時給出了8bit的情況下,解法4:使用分支操作,解法5:查表法 再計算32bit無符號整數時,需要將32bit切為4部分 然後每部分分別運用解法4解法5下面僅給出**:

解法4:

int count4(unsigned int

v)

return

num;

}

解法5:

unsigned int table[256] =;

int counttable(unsigned int

v)

網上還給出了平行演算法,思路:將v寫成二進位制形式,然後相鄰位相加,重複這個過程,直到只剩下一位。以217(11011001)為例,有圖有真相,下面的圖足以說明一切了。217的二進位制表示中有5個1。

**如下:

int count6(unsigned int

v)

求二進位制數中1的個數 《程式設計之美》

求二進位制中1的個數。對於乙個位元組 8bit 的變數,求其二進位制表示中 1 的個數,要求演算法的執行效率盡可能的高。先來看看樣章上給出的幾個演算法 解法一 每次除二,看是否為奇數,是的話就累計加一,最後這個結果就是二進位制表示中1的個數。解法二 同樣用到乙個迴圈,只是裡面的操作用位移操作簡化了。...

程式設計之美 求二進位制數中1的個數

題目 對於乙個位元組的無符號整型變數,求其二進位制表示中 1 的個數,要求演算法的執行效率盡可能高。題目很簡單,一般人都可以用最直接的方法求解出來,通過求餘和模除運算。對二進位制操作過程中,除以乙個2,原來的數就會少乙個0,如果除過程中余1,則表示當前位置有乙個1,計數值加1,很簡單。但從執行效率來...

程式設計之美2 1 求二進位制中1的個數

最近一段的時間,一直在看程式設計之美之類的演算法書籍,剛開始看程式設計之美,感覺到難度太大,有時候也不願意去翻動這本書,不過,經過一段時間的修煉,我也徹底的喜歡上這本書了,書中的演算法涉及到很多方面,樹,鍊錶,位運算,陣列,hash表應用等等。由於最近事情也忙得差不多了,我重新寫了一遍程式設計之美中...