【摘要】 详解了关于"求一个整数的二进制序列中1的个数"的三种方法,其中包括逐位%2法,逐位&1法和n&(n-1)法,包含图解,简明生动. 方法一:逐位%2法 该方法的初步测试代码如下: intNumberOf1(intn){intcount=0;while(n){if(n%2==1){count++;}n=n/2;}returncount;} 众所周知,数据在内存里...
在C语言中,右移运算符(按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1)可以帮助我们完成计算二进制中的1的个数。 方法:先将一个整数进行与1按位与(&),判断结果为1还是0,如果是1则该二进制中1的个数加1,再右移1位;再将其进行按位与1,判断结果为1...
我们随便书写一个二进制序列:1101,1101&1100,得到1100,我们发现原二进制中最右边的1消失了;再将1100&1011,得到1000,发现二进制序列中1100最右边的1也消失了。由此我们可以看到,当进行运算“n=n&(n-1)”时,会使得n的二进制序列的最右边的1消失,我们可以利用这种特性来计算二级制序列中1的个数。代码如下。 int...
1 1 。最终计数器的值就是 1 1 的个数。 现在的问题就变成了——如何得到二进制的每一位?以...
1000)&(0111)= 0(0000),清除了8最右边的1(其实就是最高位的1,因为8的二进制中只有一个1...
给定一个整数n,写一个函数输出32位二进制表示中1的个数(负数用补码表示) 方法一 分析:当我们在计算1234的每一位数相加之和时,对于得到每一位数,我们的方法是用1234%10,得到4,再将1234/10,得到123,再用123%10,如此循环,直到1234变为0。 同理,对于得到整数的每一个二进制位,我们可以通过%2,/2的方式,得到...
二、number&= number-1 ---只与二进制中1的位数相关的算法 逐个数的方法效率是比较低下的,因为它把每一位都考虑进去了,没有进行筛选,一个劲的蛮干。 现在,我们可以考虑每次找到从最低位开始遇到的第一个1,计数,再把它清零,清零的位运算操作是与一个零(任何数与零都等于零)。 但是...
二进制中1的个数--C语言 分析:方法一以循环的方式进行以下操作,直到n缩减变为0。(1) 用该数据模2,检测其是否能够被2整除 。(2)若可以,则该数据对应二进制比特位的最低位一定是0,否则是1。如果是1,给计数加1 。如果n不等于0时,继续(1) 方法二一个int类型的数据,对应的二进制一共有32个比特位,可以...
e.g.代码实现:一个整数存储在内存中的二进制中的1的个数 #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){intnum=0;intcount=0;printf("统计num的补码中有几个1,请输入num:>");scanf("%d",&num);//统计num的补码中有几个1//法一//while (num)//负数出错//{// if (num % 2 =...
ans++,n&=(n-1); return ans;}int main(){ int n; scanf("%d",&n); printf("%d的二进制数有%d个1。\n",n,solve(n)); return 0;}第二种方法:通过不断的去掉二进制中最右端的1,来计算整数二进制中1的个数,时间复杂度和二进制中1的个数有关。