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