我们要想统计十进制数字中出现的1的个数,只需要对这个数字进行“/10”与“%10”运算。比如对数字119,119 % 10 = 9,我们得到了这个数字的个位数,观察其个位数与1是否相等,相等的话1的个数就加一;然后进行整除运算119 / 10 = 11,由此我们丢弃了这个数字的个位数,得到了这个数字的前两位数。依次类推,我们再...
这样的方法复杂度为二进制的位数,即 ,于是可是想一下,有没有只与二进制中1的位数相关的算法呢。 可以考虑每次找到从最低位开始遇到的第一个1,计数,再把它清零,清零的位运算操作是与一个零,但是在有1的这一位与零的操作要同时不影响未统计过的位数和已经统计过的位数,于是可以有这样一个操作 n&(n-1) ,...
同理,对于得到整数的每一个二进制位,我们可以通过%2,/2的方式,得到该整数的每一个二进制位 代码如下 intNumberOf1(intn){intcount=0;while(n){if(n%2==1){count++;}n/=2;}returncount;} 测试 #include <stdio.h>intNumberOf1(intn){intcount=0;while(n){if(n%2==1){count++;}n/=2;}re...
一、交换两个变量(不创建临时变量)不允许创建临时变量,交换两个整数的内容(使用操作符二、统计二进制中1的个数写一个函数返回参数二进制中 1 的个数。比如: 15 0000 1111 4 个 1三、打印整数二进制的奇数位和偶数位获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列四、求两个数二进制中...
int b[30];scanf("%d",&a);while(a>0) //十进制转换为二进制 { b[i]=a%2;a/=2;i++;} for(j=0;j<i;j++) //计算1的个数 if(b[j]==1)k++;printf("%d\n",k);//1的总数 for(j=0;j<i/2;j++){m=b[j];b[j]=b[i-j-1];b[i-j-1]=m;} for(j=0...
简单的int型):int n,sum;sum = 0;scanf("%d",&n);for (int i = 0;i < sizeof(int)*8;++ i)if (n & 1<
void Convert(int n){ int i=0,count=0,j,t;int a[20]={0};while(n!=1&&n!=0)//转换二进制 { a[i]=n%2;n=n/2;i++;} if(n!=0)a[i]=1;t=i;while(i!=-1)//输出二进制 { printf("%d",a[i]);i--;} for(j=0;j<=t;j++)//统计1的个数 { if(a[j]==...
【c语言】统计一个数二进制中的1的个数,//统计一个数二进制中的1的个数#includeintcount(inta){intcount=0;while(a){count++;a=a&(a-1);}returncount;}intmain(){printf("%d\n",count(1...
用我们平时十进制转换二进制的算法,即短除法。例如:x&(x-1) 当x=5时,5的二进制是0101 0101&(0101-1) == 0101&0100==01000100&(0100-1) == 0100&0011==0000一共计算了两次,也就是说5的二进制数一共只有2个1.下面是代码实现:
int main(){ int a;int b[1000],i,x0,x1,k,c;x0=0;x1=1;printf("请输入十进制数a\n");scanf("%d",&a);if(a == 0){ printf("十进制数0转成二进制数为0\n");printf("1的个数为0\n");printf("0的个数为1\n");} c = a;for(i=0;i<1000;i++)b[i]=0;i=0;...