首页 > 系统相关 >C语言---求一个整数存储在内存中的二进制中1的个数--3种方法

C语言---求一个整数存储在内存中的二进制中1的个数--3种方法

时间:2024-05-26 20:30:02浏览次数:20  
标签:count return 二进制 -- C语言 --- int num bit

//编写代码实现:求一个整数存储在内存中的二进制中1的个数
//第一种写法
/*int count_bit_one(unsigned int n)
{
    int count = 0;
    while (n )//除到最后余数是0,那么这个循环就结束了
    {//这个题就是可以想成求15的二进制的过程
        //每次都除以2,余数为1的时候就count++
        if ((n % 2) == 1)//假设输入的是15
            count++;
        n = n / 2;//换下一个数继续除,直到所有的数除完
        //15/2=7  7/2=3  3/2=1  1/2=0,四次计算,每次计算的余数都为1
    }//15的二进制是1111
    return count; 
}
//对于这部分函数不理解的话可以自己画出自己一次计算的一个数的二进制的过程


int main()
{
    int num = 0;
    scanf("%d", &num);
    int ret = count_bit_one(num);
    printf("%d\n", ret);


    return 0;
}*/
但是我们输入-1,这个输出结果就有问题了
解决方法:传过去num,我们用unsigned int n来接收传过来的数,
使用 unsigned int 在这个函数中是恰当的,因为它确保了
 函数可以正确处理所有非负整数值,并且避免了有符号整数
 可能带来的问题。




//第二种算法--不考虑正负号
//-1在内存中的补码是全1
//11111111111111111111111111111111
//不关心符号的写法


//n&1==1   就说明n的二进制位的最低位是1
//n&1==0   就说明n的二进制位的最低位是0

//计算完这一位,想要计算下一位,那么就需要用到
//右移操作符了
//把n的二进制数的每一位都移到最低位
//00000000000000000000000000000001--1的补码
//因为&的用法是对应的二进制位,
// 有0则为0,两个同时为1才为1
//如果n的二进制数最低位和1的二进制数最低位产生反应,
//那么两个1就会场生一个1,
// 如果n的最低位数字是0,那么产生的数字仅仅是0
/*int count_bit_one(int n)
{
    int count = 0;
    for (int i = 0; i < 32; i++)
    {//有0则为0,两个同时为1才为1
        if ((n >> i) & 1 == 1)//i是从0开始的,也就是最开始的n的最低位
            //然后利用右移操作符依次变更最低位的数字
        {
            count++;//如果结果为1那么就++
        }   
    }

    return count;
}


int main()    
{    
    int num = 0;    
    scanf("%d", &num);  
    int ret = count_bit_one(num);   
    printf("%d\n", ret);    


    return 0;   
}    */



//第三种写法
//铺垫
/*
n=11   n=n&(n-1)
二进制
一开始:
n  = 1011
n-1= 1010
赋值后:   
n=n&(n-1),   &有 0就是0,两个1就是1
得到一个新的n
n  = 1010
n-1 =1001
再次用新得来的n和n-1来为新的n赋值
n=n&(n-1)
n   =    1000
n-1 =    0111
再次赋值
n=n&(n-1)
n=0000


n从最开始的1011不断赋值到0000,
n=n&(n-1)这个方程把n的二进制序列中的最右边的1去掉了
*/


//即通过反复应用 n = n & (n - 1); 直到 n 变为0,
// 每次操作清除一个1,计数器增加1,最后得到1的总数。



int count_bit_one(int n)
{
    int count = 0;
    int i = 0;

    while (n)//循环停下来的时候n就变成0了
    {
        n = n & (n - 1);//执行一次就会去掉一个1
        count++;
    }

    return count;
}




int main()
{
    int num = 0;
    scanf("%d", &num);
    int ret = count_bit_one(num);
    printf("%d\n", ret);


    return 0;
}    



每次执行 n = n & (n - 1); 都会减少 n 的二进制表示中1的个数,直到没有1剩下,此时 n 变为0,循环结束。

标签:count,return,二进制,--,C语言,---,int,num,bit
From: https://blog.csdn.net/2301_80863610/article/details/139219947

相关文章

  • 【C++风云录】走进数字农业:农业科学与粮食安全
    跨越边界:农业模拟库的编程特性与应用领域前言在本篇文章中,我们将深入探讨六个领域的软件库—APSIM,AgroLib,CropModelMKS,SoilR,Bionet和FSEarth。这些库均用于农业生态系统建模、作物模拟、农业数据处理和分析、合成作物模型构造、土壤碳氮循环模型集成、生物网络模拟以及农......
  • 【高阶数据结构】红黑树
    1.红黑树的概念2.红黑树的性质只要满足前四点规则,就能保证最长路径<=最短路径*2。由红黑树的性质可以推出:1.最短路径全是黑色结点2.最长路径一定是一红一黑相间的。3.红黑树插入结点的规则首先我们每次插入结点时都需要插入红色结点。因为插入红色结点可能会违背......
  • MySQL主从复制(五):读写分离
    一主多从架构主要应用场景:读写分离。读写分离的主要目标是分摊主库的压力。读写分离架构读写分离架构一架构一结构图:这种结构模式下,一般会把数据库的连接信息放在客户端的连接层,由客户端主动做负载均衡。也就是说由客户端来选择后端数据库进行查询。读写分离架构二架构......
  • 实验5
    task1-1:点击查看代码#include<stdio.h>#defineN5voidinput(intx[],intn);voidoutput(intx[],intn);voidfind_min_max(intx[],intn,int*pmin,int*pmax);intmain(){inta[N];intmin,max;printf("录入%d个数据:\n",N);......
  • springmvc 前端向后端发送http请求报错“HTTP状态 405 - 方法不允许”
    如图我使用前端向后端发送文件时报错,405方法不允许,于是我就检查了前后端的method方法设置是否一致?  检查后发现明明前后端请求方式一致,都是post遵循文件上传的方式。这个问题令我十分苦恼,最后发现原来是前端提交form表单时设置的选项之间存在逗号,原则是每一项之间都不应......
  • have my hair cut
    标题致敬传奇抗压王裤子。今天去剪了头发。体验很好,老师帅。但是还是一直很不安我们i人剪了头发是这样的剪头发不是换发型但大概率得换而且很快会剪短乌龟的壳换了形状或是变薄肯定不安一直觉得理发师是个很好的职业与头脑有关又是纯技术活脑袋是用来思想的地方我......
  • 关于Module中在junit测试方法和非测试方法中获取相对路径不一致的问题
    注意:Module中在junit测试方法和非测试方法中获取相对路径不一致的问题如果在Module中测试相对路径是从当前Module下找非测试相对路径是在项目下找分析原因:Module中非测试方法属于整个项目方法,它面向整个Project,Project包含了下面的各个模块(module),所以非测试方法中,获取文......
  • 实验三 电子公文传输系统安全-进展2
    实验三电子公文传输系统安全-进展2本次作业分值10分|老师评分 任务详情-上周任务完成情况(代码链接,所写文档等)-本周计划上周任务完成情况采用sm4对存储的公文进行加密处理,密钥随机生成,乱序存储在数据库中。其中sm4采用cbc模式,iv固定,跟随密文一起存储。解密的......
  • 实验二 电子传输系统安全-进展1
    实验二电子公文传输系统安全-进展2任务详情上周任务完成情况(代码链接,所写文档等)本周计划上周任务完成情况sm3加盐packagecn.edu.nuc.article.util;importorg.bouncycastle.crypto.digests.SM3Digest;importorg.bouncycastle.jce.provider.BouncyCastleProvider;......
  • Qt基础(一)QString 用法
    QString类保存16位Unicode值,提供了丰富的操作、查询和转换等函数。该类还进行了使用隐式共享、高效的内存分配策略等多方面的优化。1.字符串拼接使用+运算符//字符串拼接//+运算符staticvoidStringConnect1(){QStringstr1="Welcome";str1=str1+......