1. 程式人生 > >計算一個數的二進位制位中1的個數的方法總結

計算一個數的二進位制位中1的個數的方法總結

方法一、通過移位分別判斷各個位
int bit_count(unsigned int n)
{
int count;
        for(count=0;n;n>>=1)
{
count+=n&1;
        }
       return count;
}

方法2:迴圈中直接計算1的數量
如何只數'1'的個數?如果一個數字至少包含一個'1'位,那麼這個數字減1將從最低位開始依次向高位借位,直到遇到第一個不為'0'的位。依次借位使得經過的位由原來的'0'變為'1',而第一個遇到的那個'1'位則被借位變為'0'。
36 d = 100100 b
36-1 d = 100011 b
如果最低位本來就是'1',那麼沒有發生借位。
現在把這2個數字做按位與:n & n-1的結果是什麼?
2個數平行法計算二進位制中1的個數,二進位制中利用相鄰位相加,直到最後剩下一個數,求出1的個數。
舉例:
求255(1111 1111)二進位制中1的個數。
1 1 1 1 1 1 1 1
2 2 2 2
4 4
8
將255的8個位置進行編號,1號位置到8號位置,首先對12、34、56、78進行相加,得到2、2、2、2,分別存放於12、34、56、78位置,再將12、34、56、78看成一個整體,將12和34、56和78相加,得到4、4存放於1234、5678位置,最後再將1234和5678相加,得到8。演算法也是利用了二分的思想,給定一個二進位制數,將均分成兩部分,分別求左邊和右邊的1的個數,然後相加,最後得到結果。這個結果剛好去掉了最低的一個'1'位。
int bit_count(unsigned int n)
{
int count;
        for(count=0;n;n&=n-1)
{
count++;
        }
       return count;
}

方法三:平行法計算二進位制中1的個數,二進位制中利用相鄰位相加,直到最後剩下一個數,求出1的個數。
舉例:
求255(1111 1111)二進位制中1的個數。
1 1 1 1   1 1 1 1
  2    2     2    2
     4           4
            8
將255的8個位置進行編號,1號位置到8號位置,首先對12、34、56、78進行相加,得到2、2、2、2,分別存放於12、34、56、78位置,再將12、34、56、78看成一個整體,將12和34、56和78相加,得到4、4存放於1234、5678位置,最後再將1234和5678相加,得到8。演算法也是利用了二分的思想,給定一個二進位制數,將均分成兩部分,分別求左邊和右邊的1的個數,然後相加,最後得到結果。以上是我常用的三種方法。