計算一個數的二進位制位中1的個數的方法總結
阿新 • • 發佈:2019-01-29
方法一、通過移位分別判斷各個位 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的個數,然後相加,最後得到結果。以上是我常用的三種方法。