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