[C]C語言中函式實現返回引數二進位制中 1 的個數
阿新 • • 發佈:2018-12-16
通過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;
}