例如 十進制數10
二進制序列就是 00000000000000000000000000001010
這個二進制序列有兩個1,所以個數就是2
如果是一個負數的話我們要轉化為補碼來計算 (在這里計算機會自動幫我們轉為補碼來計算)
例如 十進制數-1
補碼=反碼+1
-1的原碼就是 10000000000000000000000000000001
反碼就是 1111111111111111111111111111111111110
補碼就是 1111111111111111111111111111111111111
因此-1的二進制序串列示1的個數有32個
第一種方法:位運算
那么我們如何寫一段代碼來計算一個十進制數的二進制序列有多少個1呢
第一種方法我們可以使用位運算
我們可以使用按位與(&),兩個數相與,只有兩個數都是1的時候,按位與的結果才是1
所以我們可以寫一個回圈,讓需要進行計算的十進制數的二進制序列的每一位都和整數1進行按位與的運算,為什么要用1呢,因為1的最低位是1,而其他位都是0,,我們然要計算的二進制序列每一位都與1進行按位與,如果是1,我們就++一下,所以我們可以設定一個變數來統計一下,
代碼如下:
#include<stdio.h>
int Numberof1(int n)
{
int count = 0;
for (int i = 0; i < 32; i++)//將32位全部按位與1
{
if (((n >> i) & 1) == 1) //讓每一位都與1進行按位與的運算
{
count++;
}
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Numberof1(n);
printf("ret=%d", ret);
return 0;
}
第二種方法:取模運算
將要計算的數對2取模,如果結果為1,就說明這個數的二進制序列有1,然后再除以2,把那個1去掉,再模2,除,知道要計算的數小于或等于0為止,
代碼如下:
#include<stdio.h>
Numberof1(unsigned int n)//無符號整型,
//沒有符號位,把符號變為負號
{
int count = 0;
while (n)
{
if (n % 2 == 1)
{
count++;
}
n /= 2;
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Numberof1(n);
printf("二進制序列中一的個數有ret=%d個", ret);
return 0;
}
這里還有第三種方法,大家如果對這種方法感興趣的話可以自己去研究一下
代碼入下:
#include<stdio.h>
int Numberof1(int n)
{
int count = 0;
int i = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Numberof1(n);
printf("ret=%d", ret);
return 0;
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/413288.html
標籤:其他
下一篇:定義一個方法,求出字串中有多少種字符,以及每個字符的個數 static void printCharInfo(String str)
