天天看點

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;
}
           

繼續閱讀