任意給定乙個32位無符號整數n,求n的二進位制表示中1的個數,比如n = 5(0101)時,返回2,n = 15(1111)時,返回4
這也是一道比較經典的題目了,相信不少人面試的時候可能遇到過這道題;
方式一:移位+計數
int bitcount(unsigned int n)
return c ;
}
int bitcount1(unsigned int n)
方法二:
這種方法速度比較快,其運算次數與輸入n的大小無關,只與n中1的個數有關。如果n的二進位制表示中有k個1,那麼這個方法只需要迴圈k次即可。其原理是不斷清除n的二進位制表示中最右邊的1,同時累加計數器,直至n為0,**如下
int bitcount2(unsigned int n)
return c ;
}
為什麼n &= (n – 1)能清除最右邊的1呢?因為從二進位制的角度講,n相當於在n - 1的最低位加上1。舉個例子,8(1000)= 7(0111)+ 1(0001),所以8 & 7 = (1000)&(0111)= 0(0000),清除了8最右邊的1(其實就是最高位的1,因為8的二進位制中只有乙個1)。再比如7(0111)= 6(0110)+ 1(0001),所以7 & 6 = (0111)&(0110)= 6(0110),清除了7的二進位制表示中最右邊的1(也就是最低位的1)。 演算法 求二進位制數中1的個數
任意給定乙個32位無符號整數n,求n的二進位制表示中1的個數,比如n 5 0101 時,返回2,n 15 1111 時,返回4 這也是一道比較經典的題目了,相信不少人面試的時候可能遇到過這道題吧,下面介紹了幾種方法來實現這道題,相信很多人可能見過下面的演算法,但我相信很少有人見到本文中所有的演算法。...
演算法 求二進位制數中1的個數
任意給定乙個32位無符號整數n,求n的二進位制表示中1的個數,比如n 5 0101 時,返回2,n 15 1111 時,返回4 這也是一道比較經典的題目了,相信不少人面試的時候可能遇到過這道題吧,下面介紹了幾種方法來實現這道題,相信很多人可能見過下面的演算法,但我相信很少有人見到本文中所有的演算法。...
求二進位制數中1的個數
解法一 可以舉乙個八位的二進位制例子來進行分析。對於二進位制操作,我們知道,除以乙個2,原來的數字將會減少乙個0。如果除的過程中有餘,那麼就表示當前位置有乙個1。以10 100 010為例 第一次除以2時,商為1 010 001,余為0。第二次除以2時,商為101 000,余為1。因此,可以考慮利用...