C語言實現谷歌面試題:寫一個函數返回參數二進制中 1 的個數

<span style="font-size:18px;">寫一個函數返回參數二進制中 1 的個數
比如: 15       0000 1111       4 個 1

</span>
<span style="font-size:18px;">方法一:參數爲整形參數,首先需要將整形參數轉換爲二進制序列,需要對這個參數進行模2除2。參數爲正整數很容<span style="font-family: Arial, Helvetica, sans-serif;">易就得出了正確結果,但是對於負整數來說直接模2除2得出的序列爲0;在參數前加上unsigned關鍵字就可以解決參數</span></span>
<span style="font-size:18px;">爲負數的問題。</span>

#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int  count_one_bits(unsigned int value)
{
	// 返回 1的位數
	int count = 0;
	int i = 0;

	while (value != 0)
	{
		if (value % 2 == 1)
		{
			count++;
		}
		value = value / 2;

	}
	return count;
}


int main()
{
	int num;
	num = count_one_bits(-1);

	printf("%d", num);
	system("pause");
	return 0;
}

方法二:對一個數按位對1取&(與);若二進制數末尾爲0,對1取&後得到爲0;若二進制數末尾爲1,對1取&後得到爲1;一個末尾數判斷結束,二進制序列向右移一位再重複執行上述步驟即可;

移位操作:num = num >> 1;

比如 10的二進制序列1010,對1(0001)按位&之後爲:0000,得到了二進制序列的末尾數。將1010向右移一位,在按位對1取&爲:001。向右移位,按位取&直到32個二進制位全部移位。

int main()
{
	int num = -1;
	int i = 0;
	int count = 0;
	
	for (i = 0; i < 32;i++)
	{
		if ((num & 1) == 1)
		{
			count++;
		}
		num = num >> 1;
	}

	printf("%d轉換爲二進制中1的個數爲:%d",num, count);
	system("pause");
	return 0;
}

方法三:num=num&(num-1); 代入一個數會發現每執行一次,從低位開始消除一個1,直到num爲0;

int main()
{
	int num = 3;
	int count = 0;
	int c = num;
	
	while (num!=0)
	{
		num = num&(num - 1);
		count++;
	}

	printf(" %d 轉換爲二進制中1的個數爲:%d個",c,count);
	system("pause");
	return 0;
}




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