1. 程式人生 > >一個整數的二進位制表示中1的個數

一個整數的二進位制表示中1的個數

給定一個整數,判斷其二進位制表示中1的個數。

第一種比較直接的思路是

1. 把這個數的低位與1取與運算,

2. 再把這個數右移1位,

3. 返回1,

結果:統計這個過程中1的個數。

但這種思路存在一個侷限,就是如果這個數是負數,那麼符號位在右移的過程中仍舊是1,這樣迴圈結束的條件不太好判斷,而且,這也改變了輸入的引數的n。

比較普遍適用的思路2是:用一個無符號數flag,從1開始,跟n取餘,對結果進行比較,如果是1,則計數加1;然後讓flag左移1。這樣迴圈,直到flag迴圈為0時,則n的所有位數都已經比較過了,輸出計數結果即可。程式碼如下:

//二進位制中1的個數。解法1
//此種方法不論n為正數或者n為負數均可
int NumberOf1(int n){
	int count = 0;
	unsigned flag = 1;
	while (flag){
		if (n & flag)
			count++;
		flag <<= 1;
	}
	return count;
}
思路3:一個小的技巧是:對於任意整數n,令其和n-1做與運算,再把結果賦值給n,這相當於把整數n的最右側的1給變為0. 利用這個思路可以設計出效率更高的演算法。程式碼如下:
//二進位制中1的個數。解法2
//此種方法不論n為正數或者n為負數均可
int NumberOf1(int n){
	int count = 0;
	while (n){
		count++;
		n = (n-1)&n;
	}
	return count;
}