计算出二进制数中有多少个1

Verilog含1个数统计电路设计 阅读详情
计算出二进制数中有多少个1

《编程之美》这本书被很多计算机专业的学生奉为面试经典, 其中也包括我。早就听高年级学长说过,面试中的题目有80%取自《编程之美》这本书, 掌握了其中的全部算法可以为自己的面试带来很多的好处。从今天起, 我每天更新编程之美上的一个算法, 方便想要学习的童鞋学习。

计算机专业的学生对二进制数应该都不陌生, 二进制就是由连续的有穷的0,1序列组成的数。那么, 我们的问题就来了, 现在我要统计一个01序列中有多少个1。那么, 我们应该怎么求解呢?

解法1:普通的解法,二进制数中相邻的两个数位在十进制书中参在2倍的关系。那么,我们的算法就出来了, 不断的对目标十进制数取余, 如果v%2==1, 那么证明当前的对应的二进制数位的数值为1;否则为0。算法如下:

int count(int v)

{

    int number = 0;

    while(v)

    {

        if(v%2 == 1)

        {

            number++;

        }

        v /= 2;

    }

    return number;

}

学过算法的同学应该不难分析出来,算法的复杂性是O(logv)。

解法2:根据上述的算法, 我们发现上诉程序的收敛过程是目标数不断的除以2。我们知道,在计算机在运算的时候,对于除法的计算异常的复杂,所以在这里我们采用位运算。算法如下:

int count(long v)

{

    int number = 0;

    while(v)

    {

        if(v%2 == 1)

        {

            number++;

        }

        v >>= 1;

    }

    return number;

}

在这里, 我们在收敛过程中使用了位运算,提高了运行的速度。但是,因为算法本身没有发生变化,所以时间复杂度为O(logv)。

解法3:在上述的算法中, 我们的知道, 算法的复杂度就是二进制数的长度,从某种意义上讲,我们对二进制进行了一个遍历。从而得到了我们的算法和分析。但是有没有更好的?在《编程之美》中 , 书中提供了一种更为快捷的算法, 时间复杂度是O(二进制数中1的个数)。

那么,写这本书的大神是怎么想出来的呢?我想思路主要有以下的几点:

(1)从算法的最有复杂度考虑:算法的最优的复杂度当然是O(1),但是这道题显然不能, 所以我们想到了下一个算法复杂度O(logN),这个复杂度是我们第一个解和第二个解的复杂度, 所以我们立马想到, 再优的算法当然就是在O(m)(m为二进制中的1的个数).

(2)有了上面的分析, 那么我们就要构造出这个算法。想要达到这个算法复杂度, 我们就必须对二进制数进行必要剪枝,所谓剪枝就是减去掉二进制数中的0。那么怎么去掉呢?我们来分析以下二进制的构成:

                                                            0x1100010101000

在上诉这个二进制数, 我们可以看到0,1交替出现,当我们用这个数减去一个1的时候, 我们发现最这个数最大的影响就是这个数的最后一一个1变为了0, 并且这个1后面全部的0变为了1, 于是我们可以想到对数进行“与”操作, 去掉受影响的部分,这样下去直到整个目标数变为0.算法复杂度还真就达到了上述的目标复杂度。

算法如下:

int count(long v)

{

    int number = 0;

 

    while(v)

    {

        v &= (v-1);

        number++;

    }

    return number;

}

呵呵, 是不是很爽, 算法的魅力就在这里,我们可以用各种稀奇古怪的东西对计算的过程进行一系列的优化。

                

统计1的个数(Verilog) RTL代码: module test( input [7:0]data_in, output [3:0]out ); // 写法一: reg [3:0]width; reg [3:0]cnt; always@(data_in)begin cnt = 'd0; for(width = 0; width < 8; width = width + 1)begin if(data_in[width]) cnt = cnt + 1'b1; else cnt = 阅读详情

相关推荐

三种方法实现求二进制中1的个数

文章目录位运算基本思路(可能造成死循环)更优解法还有一种解法 问题:输入一个整数,输出其二进制表示中1的个数 位运算 位运算是把数字用二进制表示后,对每一位上0或1的运算 与 & 或 | 异或 ^:相同为0,相异为1 左移 <<:m << n,左移n位,最左边的n位将被丢弃,同时在右边补上n个0 右移 >>:与左移相反 基本思路(可能造成死循环) 先判断输入的整数最右一位是不是1 接着将整个数字右移一位,此时,原来处于从右边数第2位的数字就成了最右一位了,再

jiuzhi_的博客 1120

计算序列1的计数(verilog)

用分治思想,计算序列1的计数(verilog),对于8bit的序列,仅需要7个full adder

qq_57502075的博客 3783

C语言计算二进制数加法

文章目录前言一、C语言中二进制数加法计算测试结果 前言 在C语言中计算二进制数的加法 一、C语言中二进制数加法计算 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> int main() { int k[100];//存放计算后的二进制数 char s1[100],s2[100];//输入的两个二进制数 int sum,sum1=

Kingykz的博客 1万+

如何判断一个数二进制中“1”的个数

在这里我们以数字“7”为例(数字“7”的二进制为“111”,有三个“1”),提供两种方法来判断一个数中二进制中“1”的 个数! 1.使用移位操作符(右移操作)     让二进制的每一位&(逻辑与)1,如果得到的结果为数字“1”,则二进制数该位有一个“1”。 #include int main() { int num = 7; int count = 0; while (num) {

cherrydreamsover的博客 1万+

计算二进制数中1出现的次数

计算二进制数中1出现的次数概述: 给定一个数,如32位的int类型的整数,由于计算机中存储都是用二进制的形式,所以计算给出的这个整数中出现1的次数 下面介绍一共五种方法: 一、mod 2 对一个整数除以2,如果整除,原来的数字就会少一个最低位的0,否则出现余数则说明最低位是1,下面给出C++代码: //mod 2 int version1(int a) { int count =

richlaji的专栏 1399

判断二进制数中有多少个1

通过建立二进制模型,并结合十进制奇偶性来解决概率问题——有一种抽奖活动,需要玩家抽中6次指定卡牌即可获奖,假设每次抽取都是独立的,抽中指定卡牌概率均为50%,卡池无限大。如果一名玩家总共抽取10次卡牌,问:能够获奖的概率?

jimgn123的博客 624

输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少

输入描述 一个正整数n,范围在[1, 2^31 - 1] 输出描述 从0到n这n+1个数中,有多少个数满足条件:该数的二进制表示没有3个连续的1 输入一 9 输出一 9 0-9这十个数中只有7(111)不满足条件,因此输出为9。 输入二 17 输出二 15 0-17这十八个数中,7(111)、14(1110)、15(1111)不满足条件,因此输出为15。 ...

仅仅是个学习笔记 1233

硬件工程师必看:5种ESD保护电路设计实战解析(附电路图)

本文为硬件工程师深度解析5种实战ESD保护电路设计,涵盖TVS二极管、专用保护芯片、片上防护及高速射频场景方案。通过具体电路图,详解工作原理、选型要点及PCB布局黄金法则,重点强调ESD防护设计中的能量泄放路径管理与低阻抗实现,助力提升产品可靠性。

xk7n92h3p5m的博客 634

输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少...

输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少? 例子:输入数字9,则输出结果位9。因为[0-9]中,只有数字7有连续的三个‘1’出现,别的都没有,所以一共有9个数字满足要求。 分析:这个题目与求解一个正整数中‘1’的个数有点类似,就是进行一些循环处理。 代码如下: 1 #include <iostream> 2 using name...

weixin_30654583的博客 324

Windows Server上OpenVPN 2.4.8双因子认证实战:账号密码+证书,附一键脚本

本文详细介绍了在Windows Server上部署OpenVPN 2.4.8双因子认证(账号密码+证书)的实战方案,包括架构设计、证书体系规划、环境准备、服务器端配置及客户端自动化部署。通过一键脚本和优化配置,提升企业VPN的安全性和运维效率,特别适合金融、医疗等对安全性要求高的行业。

weixin_29231221的博客 455

Unity四部曲(核心)

需要先改成Cube复杂的展开留到unity进阶再说。

ultraman1234566的博客 2791

PHP 输入一个整数,求该整数的二进制表达中有多少个1

1 &lt;?php 2 #计算某个二进制数共有几个1 3 #例如十进制11 = 二进制1011,则结果是3个1 4 5 #解题思路:利用 n &amp; (n - 1) 可以将最后一个1变0 6 # xxxx1000 &amp; (xxxx1000 - 1) = xxxx1000 &amp; xxxx0111 = xxxx0000 ...

weixin_34018202的博客 234

别再只用跳层连接了!手把手教你用DASI和MDCR模块提升红外小目标检测精度

本文详细介绍了如何利用DASI和MDCR模块提升红外小目标检测精度。通过分析传统跳层连接的缺陷,提出维度感知的特征选择性融合(DASI)和多尺度感受野精炼器(MDCR)的创新方案,显著提升小目标检测性能。实验证明,该方法在多个场景下AP@0.5提升达15.4%,特别适用于安防监控和遥感图像分析。

weixin_28715081的博客 221

[算法学习]计算出二进制数中1的个数

问题描述: 计算出二进制数中1的个数。 解法一:循环计数 解法与分析: 使用一个数1来“与”二进制数中每一位,若值为1则1的个数加一。 参考代码如下/** * 通过flag左移做一个循环来与num的每一位,若与计算的结果不为0,则1的个数++ * @param num * @return */ public static int calc2(int num) { int coun

KesarChen的博客 8031

【Diffusion分割】医学图像分割中去噪扩散技术

扩散模型(DPM)在图像生成方面表现出了卓越的性能,其性能往往优于其他生成模型。自其问世以来,强大的噪声-图像去噪管道已被扩展到各种判别任务中,包括图像分割。在医学成像中,图像往往是大型三维扫描图像,由于内存消耗大、迭代采样过程耗时,使用 DPM 对一幅图像进行分割的效率极低。在这项工作中,我们提出了一种(LDSeg),可在潜空间中执行扩散,用于医学影像分割。我们。潜空间条件扩散不仅能确保对多标签对象进行精确的 n-D 图像分割,还能缓解基于 DPM 的传统分割法的主要潜在问题:(。

qq_43583311的博客 1162

Hypermesh联合ABAQUS—Sets的建立和编辑

打开part copy对话框在对话框的最上面位置可以输入copy后的名称,然后将最下面的Separate disconnected regions into parts(将不连续的区域分割成parts)选项的前面方框勾选上。打开abaqus软件界面,File→import→model,将file filter选为inp格式,找到要导入的有限元文件,单击OK导入文件。HyperWorks新建Set时,会在Model Browser显示,打开Create Set对话框显示详细信息。快捷键,高亮set的内容。

动力资料屋的博客 1284

ZT CSDN 如何以最快的速度计算出一个二进制数中1的个数? [

一道算法面试题:如何以最快的速度计算出一个二进制数中1的个数? [问题点数:10分,结帖人weicai_chen] 收藏 weicai_chenweicai_chen等级:结帖率:95.12% 楼主 发表于: 2007-06-26 22:51:44 如何以最快的速度计算出一个二进制数中1的个数?假设这个二进制数位数可以很长,比如有100位以上或更...

weixin_30912051的博客 204

088、多摄像头跨镜目标追踪 ID 频繁切换?ReID 特征 + 轨迹关联 + 时间约束方案

文章摘要:本文针对多摄像头跨镜目标追踪中ID频繁切换的问题,提出了一种结合ReID特征、轨迹关联和时间约束的综合解决方案。作者分析了ID切换的三个主要原因:ReID特征不稳定、轨迹关联依赖最近邻匹配以及忽略时间约束。通过改进ReID特征提取(多层特征融合)、引入轨迹预测(卡尔曼滤波)和添加时间窗口约束,成功将ID切换率从35%降至3%以下。文章详细分享了实现细节和踩坑经验,为跨摄像头目标追踪提供了实用优化思路。

ai技术增长的博客 168

计算一个二进制数中有多少个1和0的程序

计算二进制数中有多少个1: int fun(int n) { int number_1=0; while(m!=0) { n=n&amp;(n-1); m++; } return number_1; } 计算二进制数中有多少个0: int fun(int x) { int number_0= 0; while(...

hewei512658301的博客 1811

基于MATLAB的特征模式分解(FMD)算法详解

本文详细介绍了基于MATLAB的特征模式分解(FMD)算法实现。FMD是一种新型自适应信号分解方法,通过自适应FIR滤波器组和相关峭度优化目标,有效解决传统方法(如EMD、VMD)的模态混叠问题。文章系统阐述了FMD的算法原理、数学模型和实现步骤,包括自适应FIR滤波器设计、相关峭度优化和模态选择机制。与现有方法相比,FMD在旋转机械故障诊断中展现出更强的特征提取能力和噪声鲁棒性。MATLAB实现部分包含核心函数、参数优化和可视化工具,并通过轴承故障等案例验证了算法的有效性。

qq_42212808的博客 187

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++计算二进制数中1的个数

见到计算二进制数中的1的个数的比较精巧的做法,做个笔记(其实是之前被问到了,所以就查了下…) int CountOnes(int n) { int count = 0; while(n) { ++count; n = n & (n - 1); } return count; } 刚看见时不太明白思路,然后自己拿笔随便划拉了下,算是搞明白了思路,简单总结一下。这个方法的主要...

no_367的博客 5442

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

如何以最快的速度计算出一个二进制数中1的个数

题目:如何以最快的速度计算出一个二进制数中1的个数 重点在于,这里有十亿或万亿个int数字,怎样做才能优化算法呢?解答:统计一个字节序列中1的个数,我首先想到的是最简单,把这个数每次右移一位,然后与0x01逻辑与进行统计,相当于总共将真个字节序列遍历了一遍。然而仔细想想,一个十亿或万亿的字节序列,能存到一个数(或称为变量)中?必然不可以,因此这是陷阱所在。while(num)

fly__chen的博客 5834

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

判断一个数的二进制数有多少位1

其实这篇文章可以挖的很深,从二进制的本质出发有很多可以考虑的点。但是我并不能理解这么深55555 从题目中的问题出发,我们将十进制转换为二进制的时候使用的是什么方法呢? 将该数跟2取余,再除于2,反复操作,所有的余数加起来就是目标二进制数。那么统计其中位是1的位只需要在模2的时候记录累加。在将原来的数除以2.代码如下: #include <iostream> using na...

catalpeak的博客 5995

设计算法计算出二进制数中1的个数

本文介绍了如何寻找一个二进制数中1的个数并提供了两种方法

qq_41625183的博客 623

原码,反码,补码详解及如何计算二进制数中1的数量

原码、反码、补码的定义 我们都知道计算机无法直接识别十进制数,所以我们要先把十进制数转换成二进制数存在内存中才能进行相应的计算。而原码,反码,补码就是计算机储存一个具体数字的编码方式。 原码:原码就是符号位加上真值的绝对值,即第一位是符号位,其余位表示值。 反码:正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。 补码:正数的补码是它本身,负数的补码是在其原码的基础上,...

Sid的小站 1809
上一篇: 炮兵阵地详解
下一篇: C++不得不知道的几点容易出错的知识点--1
helmsgao
博客等级 码龄16年 304粉丝 281原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值