- 博客(32)
- 收藏
- 关注
转载 浮点运算与定点运算
在数字信号处理器DSP 中,根据运算方式的不同,可分为浮点运算与定点运算 。顾名思 义,浮点运算在运算过程中,小数点的位置是变动的。定点运算则是不变。浮点运算的优 点是表示数的动态范围大,精度也可以很细。缺点是硬件复杂。定点运算的优点是运算速 度快,硬件相对简单。缺点是运算过程中容易溢出,产生误差。不管是浮点运算还是定点运算 ,两者都存在有限字长效应。即DSP的处理字长一般是16bit 或者32bit,有限长度的字长总不能精确地表示某些小数。以小数0.1为例,转成二进制就 是0.0001100110011
2021-06-30 14:20:07
4344
转载 Git 删除具体某个提交commit的方法
1.git log获取commit信息 2.git rebase -i (commit-id) commit-id 为要删除的commit的下一个commit号 3.编辑文件,将要删除的commit之前的单词改为drop 4.保存文件退出大功告成 5.git log查看比如我的提交历史如下,我现在想删除commit_B,但是不影响commit_B之后的提交历史commit_C commit_Bcommit_A操作方法如下:假如要删除备注为add...
2020-12-26 09:43:06
6156
转载 python 对字符串的判断
python中提供许多的内建函数,而这些函数可以方便的对字符串容的判断,下面主要讲解以下的判断,既然是判断那么结果肯定返回的是bool值;x为一个字符串x.isalnum() #判断是否是数字或者是字母x.isalpha() #判断字符串第一个是否是字母x.isdigit() #判断字符是否是数字组成x.islower() #判断字符中是否是小写字母(字符串中可以包含数字,返回为true)x.isupper() #判断字符中是否是大写字母(字符串中可以包含数字,返回为true..
2020-12-11 08:55:06
2574
1
转载 负数的二进制和十进制之间的转换
负数的二进制和十进制之间的转换:1.十进制负数转换为二进制的方法为:1、将十进制转换为二进制数。2、对该二进制数求反。3、再将该二进制数加1.总之就是将十进制数转换为二进制数求补码即为结果。比如:-32第一步:32(10)=00100000(2)第二步:求反:11011111第三步:加1:11100000所以-32(10)=11100000(2)2.计算机中的整数是用补码存储的,最高位为符号位,C语言也遵从同样的规则。如果最高位为0则为正数,求值的时候,直接转为10进制即可..
2020-12-10 14:26:40
10680
1
转载 《梁宁产品思维30讲》
第一讲 产品能力是每个人的底层能力,成为一个产品人是一个人建立认知框架的过程1、产品能力就是训练一个人:判断信息,抓住要点,整合有限的资源,把自己的价值打包成一个产品向世界交付,并且获得回报。2、基于人和人关系的感知,来讲怎么做产品:(1)眼睛发现痛点、找到破局点和敏锐之眼;(2)动手优化,着手改变的行动之手;(3)洞察人性的同理心,懂得自己,懂得用户,懂得一个产品上,每个细微的小点给到人的满足感、确认感和依赖感。第二讲 用户体验与结婚教练从结婚教练的例子来说明,..
2020-12-09 08:59:56
8955
转载 查看静态库.a文件包含的内容
查看静态库.a文件包含的内容用下面的命令解压: ar x libgdal.a然后就可以查看文件了:lsadler32.o cpl_recode.o dted_create.o gdalpamrasterband.o geo_write.o nitfimage.o tif_fax3sm.o tif_tile.ocompress.o c...
2020-11-25 11:47:40
7400
转载 C/C++ 静态链接库(.a) 与 动态链接库(.so)
平时我们写程序都必须include很多头文件,因为可以避免重复造轮子,软件大厦可不是单靠一个人就能完成的。但是你是否知道引用的那些头文件中的函数是怎么被执行的呢?这就要牵扯到链接库了!库有两种,一种是静态链接库,一种是动态链接库,不管是哪一种库,要使用它们,都要在程序中包含相应的include头文件。我们先来回顾一下程序编译的过程。如下图:我们结合gcc指令来看一下每个阶段生成的文件: 1 gcc-c helloWorld.c 生成一...
2020-11-25 11:21:14
1837
转载 终于有人把Docker讲清楚了!
富 Web 时代,应用变得越来越强大,与此同时也越来越复杂。集群部署、隔离环境、灰度发布以及动态扩容缺一不可,而容器化则成为中间的必要桥梁。图片来自 Pexels本文我们就来探索一下 Docker 的神秘世界,从零到一掌握 Docker 的基本原理与实践操作。别再守着前端那一亩三分地,是时候该开疆扩土了。讲个故事为了更好的理解 Docker 是什么,我们先来讲个故事:我需要盖一个房子,于是我搬石头、砍木头、画图纸、盖房子。一顿操作,终于把这个房子盖好了。结果,住了一段时间..
2020-11-10 19:59:40
167
转载 测试基础 —— 如何设计软件测试用例?
前言在我们测试工作中大多数测试人员使用的用例设计方法都是黑盒用例设计方法,其中使用最多的方法就是等价类划分法和边界值分析法,这两者也是所有的用例设计方法中最简单的,但是有一个缺点是如果我们稍不注意就会造成数据的遗漏,我们这篇文章就主要来分析一下如何合理高效的使用这两种方法设计测试用例。如何编写测试用例1.测试用例的组成元素用例编号 用例标题 功能模块名称 前置条件 输入数据 操作步骤 预期结果 优先级 执行结果 编写人 执行人 其他补充项以上列出来的项并不是需..
2020-11-10 15:38:22
248
原创 编程工作中常用的隐喻
建造软件 软件开发中的问题定义——决定造一幢什么样的房子 软件的总体设计——总体方案 软件中的详细设计——画出细节蓝图给承包商 软件创建——选房址、打地基、建造房屋框架、建好墙壁、加上屋顶、用千斤锤检查墙壁是否垂直等 软件优化——请来园艺师和装修师,以便使房间和空地得到最好的利用 软件开发中的评审和鉴定——在整个过程中,会有各种监督人员来检查房址、地基、框架、供电系统和其它东西 智能工具箱 ..
2020-11-09 20:01:38
283
1
转载 git修改分支名称
假设分支名称为oldName想要修改为 newName1. 本地分支重命名(还没有推送到远程)git branch -m oldName newName2. 远程分支重命名 (已经推送远程-假设本地分支和远程对应分支名称相同)a. 重命名远程分支对应的本地分支git branch -m oldName newNameb. 删除远程分支git push --delete origin oldNamec. 上传新命名的本地分支git push origin newNa
2020-11-07 10:41:02
1782
转载 冗长switch-case语句优化方案
1、前言 在实际的编程中,我们经常会使用到switch..case语句,这通常也是对一长串if..else if语句的优化。对于一些简单的情况(只每个case代码中代码长度不会很长,而且case分之并不多的情况),用switch..case语句即可,此时代码的可读性并不会很差,结构也算是清晰。但是一旦case分支数目众多,每个case语句块中代码长度也很长,这时对于维护这段代码的同学则是个噩梦了(本人就遇到过一段代码,case分支有近20个,每个case语句块中,代码长度均有几十上百行,有的甚至有..
2020-11-07 10:24:27
7560
转载 三种工厂模式的C++实现
引出工厂模式的设计问题◆ 1.为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。这里很容易出现的一个问题 n 多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就编写诸如 new ×××;的代码。这里带来两个问题:客户程序员必须知道实际子类的名称(当系统复杂后,命名将是一个很不好处理的问题,为了处理可能的名字冲突,有的命名可能并不是具有很好的可读性..
2020-11-07 09:02:52
330
原创 git常用指令
【“好的文章不是写出来的,而是改出来的。” 代码提交也是如此。提交做小、提交做对、提交做好】合并commit:git rebase -i HEAD~2查看每次提交的修改量:git log --no-merges --pretty="" --shortstat回退本地commitgit reset --soft HEAD^保存本地修改到stashStep1:git statusStep2:git stashStep3:git pull(此时可以pull或rebase等)..
2020-11-05 17:01:13
145
转载 重载(overload)、覆盖(override)、隐藏(hide)的区别示例
这三个概念都是与OO中的多态有关系的。如果单是区别重载与覆盖这两个概念是比较容易的,但是隐藏这一概念却使问题变得有点复杂了,下面说说它们的区别吧。重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,只是函数的实现体不一样。隐藏是指派生类中的函数把基类中相同名字的函数屏蔽掉了。隐藏与另外两个概念表面上看来很像,很难区分,其实他们的关键区别就是..
2020-10-31 17:49:29
451
转载 Linux内核架构和工作原理详解
简介作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。Linux进程1.采用层次结构,每个进程都依赖于一个父进程。内核启动init程序作为第一个进程。该进程负责进一步的系统初始化操作。init进程是进程树的根,所有的进程都直接或者间接起源于该进程。virt/ ---- 提供虚拟机技术的支持。全文导读Linux内核预备工作 Linux内核体系结构简析简析 Linux体系结构和内...
2020-10-28 17:02:11
1923
转载 FTA故障树分析法-DFMEA的另外一张脸
本章目的:明确什么是FTA,及与DFMEA的关系。1.FTA定义故障树分析(FTA)其一:故障树分析(Fault Tree Analysis,简称FTA)又称事故树分析,是安全系统工程中最重要的分析方法。事故树分析从一个可能的事故开始,自上而下、一层层的寻找顶事件的直接原因和间接原因事件,直到基本原因事件,并用逻辑图把这些事件之间的逻辑关系表达出来。其二:FTA是系统分析的一种技术,它从单个的潜在失效模式来识别所有的可能原因,分析系统失误。FTA考虑的是相互关联的原因以及独立原因。除...
2020-10-28 12:21:19
20504
转载 高效会议的组织方法
关于开会大家应该都不陌生,而且应该有不少人被过度频繁的会议“伤过”,甚至”谈会色变“ 。当一个组织的人员较多,结构复杂时这个问题会更加突出。如果开发人员/测试人员参加会议过多,会导致工作打断严重,直接影响到团队工作效率。如果管理人员参加会议过多,就会导致管理人员离开所负责的管辖范围时间较长,不能及时响应事情,从而导致团队整体管理效率变低,典型表现是很多事情没有及时处理、开始积压。当然会议是需要的,主要是我们要总结出一套高效的方法。下面分享一些总结,有兴趣的同事可以一起探讨。第一,确认...
2020-10-28 09:05:43
784
转载 联调
联调有3个目的:1、将项目组的代码整合起来,这点在好的项目管理中编码阶段已经完成了大部分的集成工作。2、保证系统的质量,避免后期的大改动,之后转集成阶段3、进行质量评定以调整测试策略按项目管理的五要素分解如下:1、干系人期望-目标 编码阶段干系人的影响已经很小,先不讨论。 2、沙盘-思路 1)代码覆盖率 只有被跑过的代码才是安全的,之前的任何假设只有通过验证才能得到结果。代码覆盖率是保证质量的一个基本指标,通常...
2020-10-28 08:56:21
5780
转载 钩子函数简析及实例
钩子函数、回调函数、注册函数,挂钩子这些我们代码中经常涉及到的东西,是否已经困扰你很久了?它们究竟是怎么回事,究竟怎么用?下面我来为你一一解答。什么是钩子函数?钩子函数也叫回调函数,是通过函数指针来实现的,那我们来看看什么是函数指针。首先看看以下例子:int *p;int a,b;我们可以让指针p先后指向a, b,这样,p就先后代表了不同变量的地址p = &a;p = &b;同样地,函数的指针可以指向不同的函数,从而完成不同的功能。例如,定义函数指..
2020-10-26 17:59:05
625
转载 代码细节——圈复杂度
什么是圈复杂度?—————————————————————————————————————圈复杂度(Cyclomatic Complexity)是衡量计算机程序复杂程度的一种措施。它根据程序从开始到结束的线性独立路径的数量计算得来的。圈复杂度越高,代码就越难复杂难维护。坑就越大。。。从1开始,一直往下通过程序。 一但遇到以下关键字,或者其它同类的词,就加1:if,while,repeat,for,and,or。 给case语句中的每一种情况都加1。例如下面这个函数,圈复杂度为1,意..
2020-10-26 17:23:24
1544
转载 风险管理
有人说管理的最高境界是时间管理,我不以为然,时间管理并没有触到根本,根本的应该是风险管理。说风险管理不是要固守而消极进取,因为无论是固守或进取,风险都是存在的。甚至很多时候,进取才是摆脱风险的最佳选择。在项目中,风险管理大致需做以下工作:...
2020-10-21 15:59:43
566
转载 “分而治之”的策略
不同的问题有不同的模型和不同的规律,所以也相对应了不同的算法。但是以要言之,所有算法都统归在“分治”的策略之下,这里讨论的“分治”不是狭义的分治算法,而是一种策略。以递归算法为例,递归本质上就是“三步曲”:1、终止条件是什么?2、本级递归做什么?3、返回值是什么?因此在具体的算法设计和实现上就可分成这三部分考虑,比较清晰。再说动态规划算法,动态规划算法通常被拿来与分治算法比较,分治算法的子问题往往相互独立,如下图一段代码:原题来源于leetcode,这是一个典型的分治算法。...
2020-10-21 15:53:31
1299
原创 代码细节——接口宏定义
此处仅讨论与协议或者接口相关的宏定义,使用宏定义变量比直接使用数字有以下便利:1、相对“魔鬼数字”,使用宏定义会使代码含义更加明确;2、维护方便,当接口或者协议变更,通过修改宏定义来“一键式”替换,一可以减少工作量,;二可以保证不会漏改,大大减少出错概率(这点很重要)。...
2020-10-16 17:11:23
577
转载 卡尔曼滤波原理图文详解
什么是卡尔曼滤波? 你可以在任何含有不确定信息的动态系统中使用卡尔曼滤波,对系统下一步的走向做出有根据的预测,即使伴随着各种干扰,卡尔曼滤波总是能指出真实发生的情况。 在连续变化的系统中使用卡尔曼滤波是非常理想的,它具有占用内存小的优点(除了前一个状态量外,不需要保留其它历史数据),并且速度很快,很适合应用于实时问题和嵌入式系统。 在Google上找到的大多数关于实现卡尔曼滤波的数学公式看起来有点晦涩难懂,这个状况有点糟糕。实际上,如果以正确的方式看待它,卡尔曼滤波是非常简单和容易理解的,下面
2020-10-14 14:06:05
7216
转载 C++ 虚函数表解析
前言C++中 的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术 可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不做过多的阐述。大家可以看看相关的C++的书籍。在这篇文章中,我只想从虚函数的实现...
2020-10-14 09:30:25
177
原创 结构体位域
位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即可。为节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。struct bs{ UINT32 a : 8; UINT32 b...
2020-10-13 20:32:56
507
原创 word && byte && bit
数据存储是以“字节”(Byte)为单位,数据传输大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位。在16位系统中,1字(word)=2字节(byte)=16位(bit)在32位系统中,1字(word)=4字节(byte)=32位(bit)在64位系统中,1字(word)=8字节(byte)=64位(bit)字节对齐:https://zhuanlan.zhihu.com/p
2020-10-13 20:23:34
436
转载 大端模式和小端模式
一、什么是大端,什么是小端0x123456在内存中的存储方式(以一个byte为一个单元)- 大端模式 低地址 -----> 高地址 0x12 | 0x34 | 0x56- 小端模式 低地址 -----> 高地址 0x56 | 0x34 | 0x12二、为什么会有大小端之分1. 一开始是由于不同架构的CPU处理多个字节数据的顺序不一样,比如x86的是小端模式,KEIL C51是大端模式。但是后来互联网流行,TCP/IP协议规定为大端模式,为了跨平台通信,还专...
2020-10-13 20:20:10
235
原创 结构体强转说明
1、结构体的本质C语言结构体的实质是我们和系统约定了一段内存空间,该空间中安排存放结构体的成员。结构体中所有成员的值都是以二进制形式存储在内存中,每个字节都对应一个内存的地址,内存存储不意识所存储的数据属于哪种类型,例如int、char、float,或者指针等。通过结构体的起始地址和结构体内的各成员变量离起始地址的偏移可以实现对这些成员变量的访问。举例说明:typedef struct{ int x; int y;} StructA;...
2020-10-13 14:15:08
728
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人