1. 程式人生 > >[C]C語言中函式實現返回引數二進位制中 1 的個數

[C]C語言中函式實現返回引數二進位制中 1 的個數

通過C語言程式將十進位制數轉化成二進位制數,然後求出二進位制數中1的個數。

下面用三種方法來實現。來

方法一:

除2取餘法。對一十進位制數,用2輾轉相除至結果為1,將餘數和最後的1從下向上倒序寫就是對應的二進位制。

例如:十進位制數302轉化成二進位制。

302/2=151餘0;151/2=75餘1;75/2=37餘1;37/2=18餘1;18/2=9餘0;9/2=4餘1;4/2=2餘0;2/2=1餘0,故二進位制為100101110。(二進位制中首位是符號位,正數加1,負數加0)

此方法的缺點是隻可以對正數運算,一旦輸入負數結果出現錯誤。

程式碼如下:

#include<stdio.h>
int main()
{
   int num,count=0;
   scanf("%d",&num);
   while(num)
   {
      if(num%2==1)count++;/*如果num除2的餘數為1時,即為二進位制中1*/
      num=num/2;
   }
   printf("count=%d",count);
return 0;
}

方法二:

移位法。移位法分為左移和右移兩種情況,左移時數的右邊都補0;右移時正數左邊補0,負數左邊補1。C語言中“<<”為左移運算子,“>>”為右移運算子。移位法雖可以正負數進行轉換,但它的缺點是效率低下,對於-1這個數需要向右移位32次才能找到對應的二進位制數。下面程式用了“右移法”實現十進位制到二進位制的轉換。

程式碼如下:

#include<stdio.h>
int main()
{
    int i,num,count=0;
    scanf("%d",&num);
    i=32;/*32或64位位元位*/
    while(i--)
    {
         if(num&1==1)count++;
         num=num>>1;
         /*>>右移運算子;右移時負數補1、正數補0,num>>1指右移1位*/
     }
     printf("count=%d",count);
return 0;
}

方法三 :

按位“與”法,即x=x&(x-1)。此方法不僅可以對正負數進行十進位制到二進位制的轉化,而且效率高。對於整型數在存放地址時,它以32位或64位的補碼形式存放。x=x&(x-1)還可以判斷某數是否為2的n次方,當結果為0時,則這個數就是2的n次方。

下面對十進位制數15進行轉換分析:

15的八位二進位制數補碼為0000 1111.

               第一次與運算                         x                   0000 1111

                                                  x-1                 0000 1110

                                                  x&(x-1)             0000 1110---14

                第二次與運算                         x                  0000 1110

                                                   x-1                0000 1101

                                                   x&(x-1)            0000 1100---12

                第三次與運算                          x                 0000 1100

                                                    x-1               0000 1011

                                                    x&(x-1)           0000 1000---8

                第四次與運算                          x                 0000 1000

                                                    x-1               0000 0111

                                                    x&(x-1)           0000 0000---0

進行4次與運算後結果為0,則二進位制中1的個數就為4。

程式碼如下:

#include<stdio.h>
int main()
{
     int num,count=0;
     scanf("%d",&num);
     while(num)
     {
            num=num&(num-1);
            count++;/*num不為0時,每進行一次與運算,則二進位制中1的個數加1*/
     }
     printf("count=%d",count);
return 0;
}