0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

三种方法计算二进制中1的个数,最后一种比较炸裂!

学益得智能硬件 来源:学益得智能硬件 2023-11-24 17:35 次阅读
如何计算一个整数的二进制表示中 1 的个数?看看三位同学给出的代码。
#include 


int main()
{
    int x = 1000, count = 0;


    for (int i = 0; i < 32; i++)
    {   
        if (x & 0x01)
        {   
            count++;
        }   


        x = x >> 1;
    }   


    printf("%d
", count);


return 0;
}

第一种最简单,只要让这个数字跟 0x01 进行与运算,就能判断出来最低位是不是1。然后右移一位,进行同样的操作。循环32次,就能得到结果。这是刚入门C语言的同学写的代码。
#include 


int main()
{
    int x = 1000, count = 0;


    while (x) 
    {   
        x = x & (x - 1); 
        count++;
    }   


    printf("%d
", count);
    return 0;
}
第二种稍微厉害一些,用到了 x & (x - 1) 这么一行代码,它的作用就是让二进制表示中最后一个 1 变成 0 ,不断的让这些 1 变成 0,最后这个数字也就变成了 0 ,只要知道这行代码执行了多少次,结果也就知道了。能写出这个代码,简历上写个掌握C语言编程一点也不为过。
#include 


int main()
{ 
    unsigned int temp = 1000; 


    temp = (temp & 0x55555555) + ((temp & 0xaaaaaaaa)>>1);
    temp = (temp & 0x33333333) + ((temp & 0xcccccccc)>>2);
    temp = (temp & 0x0f0f0f0f) + ((temp & 0xf0f0f0f0)>>4);
    temp = (temp & 0xff00ff) + ((temp & 0xff00ff00)>>8);
    temp = (temp & 0xffff) + ((temp & 0xffff0000)>>16);


    printf("%d
", temp);


    return 0;  
}
最后一种比较炸裂,本来很简单的一个问题,被它写得非常复杂。这是当年阿里的一道C语言笔试题。代码的功能也是计算整数 temp 的二进制表示中 1 的个数。原题中 temp 的值是0x11530828,换成二进制是:
0001 0001100100110000100000101000
假设有个二进制数:01,含有 1 个 1,正好二进制 01 对应的十进制也是 1。再假设有个二进制数 11,含有 2 个 1,正好二进制 11 对应的十进制是 2。于是不难得出一个结论:如果一个二进制数只有两位,那么它对应的十进制数就是该二进制中包含的 1 的个数。算法中核心的代码有 5 行,分别是:
temp = (temp & 0x55555555) + ((temp & 0xaaaaaaaa)>>1);
temp=(temp&0x33333333)+((temp&0xcccccccc)>>2);
temp=(temp&0x0f0f0f0f)+((temp&0xf0f0f0f0)>>4);
temp=(temp&0xff00ff)+((temp&0xff00ff00)>>8);
temp=(temp&0xffff)+((temp&0xffff0000)>>16);
每一行的作用都是让相邻的两位相加,temp的原始值是:
0001 0001 1001 0011 0000 1000 0010 1000
经过第一行代码,相邻的两个数字相加,得到:
0 1 0 1 1 1 0 2 0 0 1 0 0 1 1 0
对应的 temp 是:
0001000101010010 0000 0100 0001 010
经过第二行代码,相邻的两个数字相加,得到:
1 1 2 2 0 1 1 1
对应的 temp 是:
0001 0001 0010 0010 0000 0001 0001 0001
经过第三行代码,相邻的两个数字相加,得到:
2 4 1 2
对应的 temp 是:
0000001000000100 0000 0001 0000 0010
经过第四行代码,相邻的两个数字相加,得到:
6 3
对应的 temp 是:
0000 0000 0000 0110 0000 0000 0000 0011
经过第五行代码,相邻的两个数字相加,得到:
9
对应的 temp 是:
00000000000000000000000000001001
结果就是整数 temp 二进制表示中 1 的个数。



声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 二进制
    +关注

    关注

    2

    文章

    792

    浏览量

    41593
  • 代码
    +关注

    关注

    30

    文章

    4741

    浏览量

    68326

原文标题:三种方法计算二进制中1的个数,最后一种比较炸裂!

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    进制二进制之间的转换原理

    1.3.4 将(155)D转换为二进制数解:当要将个很大的十进制数转换成二进制数时,采用例题1.3.3的做法很费时 ,我们可以采用另外一种方法
    发表于 04-06 23:54

    二进制格雷码与自然二进制码的互换

    位、13位、14位或更高位等多种。其中采用循环二进制编码的绝对式编码器,其输出信号是一种数字排序,不是权重码,每位没有确定的大小,不能直接进行比较大小和算术运算,也不能直接转换成其他
    发表于 03-08 14:16

    Labview如何将个数字转换为5位二进制,8位二进制以及任意位的二进制表示呢

    Labview如何将个数字转换为5位二进制,8位二进制以及任意位的二进制表示呢
    发表于 01-22 17:22

    二进制

    二进制   二进制与十进制的区别在于数码的个数和进位规律有很大的区别,顾名思义,二进制的计数规律为逢
    发表于 04-06 23:48 8163次阅读
    <b class='flag-5'>二进制</b>

    二进制编码和二进制数据

    二进制编码和二进制数据   二进制编码是计算机内使用最多的码制,它只使用两个基本符号"0"和"1",并且通过由这两个符号组成的
    发表于 10-13 16:22 4760次阅读

    二进制电平,什么是二进制电平

    二进制电平,什么是二进制电平 在二进制数字通信系统,每个码元或每个符号只能是“1”和“0”两个状态之
    发表于 03-17 16:51 2348次阅读

    一种二进制校正的10位100MS_sSARADC

    一种二进制校正的10位100MS_sSARADC_倪亚波
    发表于 01-07 21:45 0次下载

    二进制数据压缩算法

    二进制数据压缩算法二进制计算技术中广泛采用的一种数制。二进制数据是用0和1
    的头像 发表于 02-28 09:31 2w次阅读

    二进制数转换成bcd码

    二进制计算技术中广泛采用的一种数制。二进制数据是用0和1个数码来表示的数。它的基数为2,进位
    的头像 发表于 11-22 07:01 1.2w次阅读

    二进制数据及取值范围的计算方法

    本文介绍二进制数据的相关知识,如定义、取值范围计算、转换为十进制方法以及些常见位数的二进制
    的头像 发表于 11-08 15:48 1995次阅读
    <b class='flag-5'>二进制</b>数据及取值范围的<b class='flag-5'>计算方法</b>

    二进制最佳接收原理 二进制最佳接收机的实现形式有哪两

    二进制最佳接收原理 二进制最佳接收机的实现形式有哪两二进制最佳接收原理是计算机通信中的重要概念,它是指在
    的头像 发表于 11-27 16:19 974次阅读

    如何实现二进制和BCD码数据的相互转变?

    的编码标准。在本文中,我们将详细讨论二进制和BCD码数据的相互转换方法二进制数的基本概念与表示方法
    的头像 发表于 02-18 14:51 3251次阅读

    二进制补码及与原码的互相转换方法

    大沙把些基础的知识说清楚,本文介绍二进制补码及与原码的转换方法。 先说原码,原码‌是一种计算机中对数字的
    的头像 发表于 09-19 22:25 366次阅读

    二进制编码器工作原理 如何选择二进制编码器

    二进制编码器是一种数字电路,它将输入的二进制代码转换为对应的输出信号。在数字系统,编码器用于将数据从一种形式转换为另
    的头像 发表于 11-06 09:44 254次阅读

    二进制编码器应用场景 二进制编码器与模拟编码器比较

    编码器是将信息从一种形式或格式转换为另一种形式的设备。在数字和模拟系统,编码器扮演着至关重要的角色。二进制编码器和模拟编码器是两常见的编
    的头像 发表于 11-06 09:45 228次阅读