**比如:15 的二進制數位0000 0000 0000 0000 0000 0000 1111 ,則結果傳回4
**
程式原型:int count_one_bits(unsigned int value)(說明:采用unsigned是int類型的-1中1的個數位32,-1是負數,在計算機中存的時補碼)
(1)方法一
<類比于十進制>
例如:輸出123 的每一位的數字
123%10=3
123/10=12 12%10=2
12/10=1 1%10=1
輸出十進制數字的每一位采用/10 ,%10的方法,
同樣地類比于十進制,二進制數就采用/2 ,%2 的方法。
#define _CRT_SECURE_NO_WARNINGS 1
int count_one_bits(unsigned int num)
{
int count = 0;
while (num != 0)
{
if (num % 2 == 1)
{
count++;
}
num = num / 2;
}
return count;//傳回count次數
}
int main()
{
int num ;
printf("請輸入整數:");
scanf("%d", &num);
printf("整數中1的個數為:%d\n", count_one_bits(num));
return 0;
}
(2)方法二
<用單目操作符&> (正常解法)
#define _CRT_SECURE_NO_WARNINGS 1
int count_one_bits(unsigned int num)
{
int count = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
if ((num >> i) & 1 == 1)//num右移i位與1相與,看結果是否為1.如果結果為1,num第i位為1,否則為0.總共移動32次.
{
count++;
}
}
return count;//傳回count次數
}
int main()
{
int num;
printf("請輸入整數:");
scanf("%d", &num);
printf("整數中1的個數為:%d\n", count_one_bits(num));
return 0;
}
(3)方法三
例如:求二進制數字7中1的個數(為了友善,我隻寫最後8位)
0000 0111 7
& 0000 0110 6
0000 0110 6(結果)
& 0000 0101 5
0000 0100 4(結果)
& 0000 0011 3
0000 0000 0
二進制數7減一之後與其相與,相與三次之後為0,且7的1的個數為3。
由此可得,當num不為0時,循環num&(num-1),直到最後相與結果為0。則相與的次數就是二進制數num中1的個數。
#define _CRT_SECURE_NO_WARNINGS 1
int count_one_bits(unsigned int num)
{
int count = 0;
int i = 0;
while (num!=0)
{
num = num&(num - 1);
count++;
}
return count;//傳回count次數
}
int main()
{
int num;
printf("請輸入整數:");
scanf("%d", &num);
printf("整數中1的個數為:%d\n", count_one_bits(num));
return 0;
}
以上三種代碼運作結果都如下所示: