請實現一個函數,輸入一個整數,輸出該函數二進制表示中1的個數。

題目:請實現一個函數,輸入一個整數,輸出該函數二進制表示中1的個數。
例如:把9表示成二進制是1001,有2位是1.因此,如果輸入9,則輸出2

  • 可能引起死循環的解法
思路: 先判斷整數二進制中最右邊是不是1;接着把輸入的整數右移一位,此時原來處於從右邊氣的第二位被到最右邊了,再判斷是不是1;這樣每次移動一位,直到整個整數變成0爲止。
           現在的問題變成了怎麼判斷一個整數的最右邊是不是1.這很簡單,只要把整數和1做位與運算看結果是不是0就知道了。1除了最右邊的一位之外所有位都是0 .
           如果一個整數與1相與結果爲1,則表示該整數最右邊一位是1,否則是0.

int numberOf1(int)
{
    int count = 0;
    while(n){
        if(n & 1)
            count++;
        n = n >> 1;    
    }
    return count;
}

  • 常規解法
思路: 爲了避免死循環,我們可以不右移輸入的數字n。
            首先把n和1做與運算,判斷n的最低位是不是1。接着把1左移一位得到2,再和n做與運算,就能判斷n的次低位是不是1......這樣反覆左移,每次都能判斷n的其中一位是不是1.
int numberOf1(int n)
{
    int count = 0;
    unsigned int flag = 1;
    while(flag){
        if(n & 1)
            count++;
        falg = flag << 1;
    }
    return count;
}


  • 新穎解法
 思路:把一個整數減去1,再和原整數做與運算,會把該整數的最右邊的1變成0。那麼一個整數的二進制表示中有多少個1,就可以進行多少次這樣的操作。
舉個栗子:1100,它的第二位是從最右邊數起的一個1.減去1後,第二位變成0,它後面的兩位0變成1,而前面的1保持不變,因此得到的結果爲1011.
int numberOf1(int n)
{
    int count = 0;
    while(n){
        ++count;
        n = (n - 1) & n;
    }
    return count;
}

#include <stdio.h>
//#include <windows.h>
#include <stdlib.h>

/**
題目:請實現一個函數,輸入一個整數,輸出該函數二進制表示中1的個數。
例如:把9表示成二進制是1001,有2位是1.因此,如果輸入9,則輸出2
**/

//可能引起死循環的解法
int numberOf1(int n)
{
	int count = 0;
	while (n) {
		if (n & 1)
			count++;
		n = n >> 1;
	}
	return count;
}
//常規解法
int numberIs1(int n)
{
	int count = 0;
	int flag = 1;
	while (flag) {
		if (n & flag)
			count++;
		flag = flag << 1;
	}
	return count;
}
//新穎解法
int numberOf_1(int n)
{
	int count = 0;
	while (n) {
		++count;
		n = (n -  1)& n;
	}
	return count;
}
int main()
{
	int num = 0;
	printf("Please input Number:\n");
	scanf_s("%d", &num);
	int ret = numberOf_1(num);
	//int ret = numberIs1(num);
	//int ret = numberOf1(num);
	printf("ret = %d\n", ret);

	system("pause");
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章