自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 Java大数源码剖析(三) - 1.乘法运算

这是Java大数源码剖析系列的第三篇文章, 上一篇文章是Java大数源码剖析(二) - BigInteger的加减操作BigInteger提供的乘法操作乘法 : public BigInteger multiply(BigInteger val)使用示例public class Test { public static void main(String[] args) { BigInteger a = new BigInteger("12090"); B

2021-07-23 01:25:08 370

原创 三种大数相乘算法

在研究Java的BigInteger乘法操作的源码时,在JDK的实现里看到了三种算法,调用multiply会根据两个乘数的大小进入不同的算法进行进一步的计算,他们分别是:小学生算法(Grade-School Algorithm)Karatsuba算法(Karatsuba Algorithm | Brilliant Math & Science Wiki)Toom Cook-3算法下面分别讲解各个算法,前面两种算法是比较好理解和实现的,而最后一种算法是比较复杂的。当然,本篇文章重点讲解三种

2021-07-21 12:00:33 1495 1

原创 Java大数源码剖析(四) - 1.位运算

BigInteger提供的位操作按位与 : public BigInteger and(BigInteger val)按位与上对方的非 : public BigInteger andNot(BigInteger val)按位或 : public BigInteger or(BigInteger val)按位异或 : public BigInteger xor(BigInteger val)按位非 : public BigInteger not()使用示例public class Test

2021-07-18 10:01:50 492 1

原创 Java大数源码剖析(二) - BigInteger的加减操作

这是Java大数源码剖析系列的第二篇文章, 上一篇文章是Java大数源码剖析(一) - BigInteger的底层数据结构BigInteger提供的加减操作加法 : public BigInteger add(BigInteger val), 将返回本身加上val的结果减法 : public BigInteger subtract(BigInteger val), 返回本身减去val的结果使用示例public class Test { public static void main(

2021-07-15 18:29:55 1782

原创 Java大数源码剖析(一) - BigInteger的底层数据结构

Java大数源码剖析(一) - BigInteger的底层数据结构本系列文章对Java大数类源码进行剖析, Java大数类包括java.math.BigInteger和java.math.BigDecimal, 本人使用的JDK版本为13.0.2本系列文章按照以下顺序 :BigInteger的介绍和底层数据结构 (一篇文章)依次剖析BigInteger各个常用方法的源码实现(从简到难) (若干篇文章)讲解BigDecimal的的介绍和底层数据结构 (一篇文章)依次剖析BigInteger各个

2021-07-15 18:24:16 940 1

原创 8086汇编复习手册

文章目录8086汇编复习手册8086平台基础大小端寄存器标志位寻址方式及其使用和注意事项8086对段寄存器使用的约定8086汇编模板(熟练记忆, 考试要写)8086汇编指令速查表常用DOS调用汇编子程序设计汇编常用技法汇编编程实战输入输出0.输入以回车结束的字符串1.输出有结束标志的字符串2.输出N进制数3.输入N进制数数组0.找出数组中的最大值1.插入元素到升序序列2.排序数组(冒泡排序)字符串0.比较字符串是否相等1.翻转字符串(同样适用于数组)综合示例0.输入字符串找出出现数量最多的字符输出该字符及其

2021-07-03 18:47:10 1068 1

原创 g++出现In instantiation of ...required from here ...warning可能的的解决方法

头一次碰到g++出现了一个很奇怪的警告,输出信息大概是 : In instantiation of …required from here …warning改来改去改不掉,最终发现是因为构造函数初始化列表没有按照类内声明变量的顺序来写,比如class A {public: A(int a, char b) :m_b(b), m_a(a) { } // warning private: int m_a; char m_b;}// 改成下面这样就没..

2021-03-08 17:02:45 5904

原创 使用C++写线程安全队列

引STL的容不是线程安全的,我们经常会有需求要求数据结构线程安全,比如写生产者消费者模型的时候,就要求队列线程安全。利用std::queue和C++线程标准库的一些组件(mutex,condition_variable),可以写一个线程安全的队列ConcurrenceQueue定义基本结构需要4个函数push,入队;pop,出队并返回原来对头的元素,如果为队空则阻塞;tryPop,出队并返回原来对头的元素,如果队空返回空(使用智能指针作返回类型);empty,返回是否为空,实则没啥用,

2021-03-06 19:01:19 972

原创 一个好用的Makefile for C++ program

利用Makefile自带的一些语法,我们可以写出一个较为通用的Makefile有以下几个功能:make init : 在当前文件夹初始化项目make clean : 清理项目make run : 启动make rerun : 清理、重新编译、运行src = $(wildcard ./src/*.cpp)obj = $(patsubst ./src/%.cpp, ./obj/%.o, $(src))includePath = ./includeextArgs = -g -I $(in.

2021-03-05 09:42:14 180

原创 算法刷题笔记 - 二维数组中的查找

二维数组中的查找来源 : LeetCode - 剑指 Offer 04. 二维数组中的查找难度 : 中等标签 : 二叉搜索树(BST), 二分查找(BS)题目描述在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例 :给定 target = 13,返回 true。给定 target = 20,返回 false。解法一:二叉搜索

2021-03-04 12:28:08 357

原创 对象池/内存分配器的依赖问题

在昨天写C++ Json解析库时遇到了很难找的Bug,利用对象池管理不同类型的对象,这些对象不是相互独立的而是互相依赖的。这就导致了在最后对象池执行析构时释放所有的对象出现了问题,具体如下。Node类,是一个泛化的值,底层利用union/variant以实现可以容纳Json要求的所有类型的值,Number,Null,True,False,String,Array,Object等等。其中String,Array和Object时特殊的,其中含有指针用来指向分配好的对象,这就涉及到了析构。String类,其

2021-03-03 15:10:39 144 1

原创 对象池C++11实现

内存分配器class MallocAllocator {public: MallocAllocator() = default; ~MallocAllocator() = default; void * allocate(SizeType size) { return ::malloc(size); } void * reallocate(void * ptr, std::size_t newSize) { return ::r

2021-02-27 20:51:59 155

原创 算法刷题笔记 - 连接网络的操作次数(dfs, 并查集)

连接所有点的最小费用来源 : LeetCode - 连接网络的操作次数难度 : 中等标签 : dfs, 并查集题目描述用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。给你这个计算机网络的初始布线 connections,你可以拔开任意两台直连计算机之间

2021-01-23 14:38:20 181

原创 C++实现工厂设计模式

C++实现工厂设计模式在做Data-Driven设计的时候,我们希望能对象的创建能依运行时文件的读入而不是硬编码在代码里。比如在设计游戏时,我们希望能够做到根据外部配置文件(可由游戏设计器生成)自动生成对象,并且配置好对象的属性。这时,我们需要做到的时根据文件的信息判断处需要创建出哪种类型的对象,这时我们可能想到的方法是// 从配置文件中解析出typeIDswitch (typeID) {case PLAYER : return Player();case TANK : return Tan

2021-01-23 01:34:46 222

原创 使用C++手写队列 - Queue

使用C++手写队列我们使用C++写过了Vector、Stack,这篇文章我们来写一下队列Queue;Queue的特点是先进先出,或者说满足这一特性的我们可以称之为队列;和栈Stack一样,Queue只是定义了一组操作,满足一系列操作的就可以称为队列,此次我们采用顺序表进行实现,即对C++的动态数组进行简单的封装并且提供一系列队列应有的操作;在我们实现Stack的时候,我们利用了我们写的Vector,那么为什么这次不继续使用而是从最基本的动态数组入手呢。这是因为Queue的特性是先进先出,即队尾进,

2021-01-21 18:22:39 1247

原创 算法刷题笔记 - 正则表达式匹配(动态规划)

正则表达式匹配来源 : LeetCode - 正则表达式匹配难度 : 困难标签 : 动态规划题目描述给你一个字符串s和一个字符规律p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要匹配整个字符串s, 而不是部分字符串。例子:"mississippi"和"mis*is*p*."不匹配"aab"和"c*a*b"匹配特别的".*"可匹配任意字符串解法构思有关

2021-01-20 19:27:52 243

原创 算法刷题笔记 - 连接所有点的最小费用(最小生成树)

连接所有点的最小费用来源 : LeetCode - 连接所有点的最小费用难度 : 中等标签 : 最小生成树题目描述给你一个points数组,表示2D平面上的一些点,其中points[i]为第i个点。连接点[xi, yi]和点 [xj, yj]的费用为它们之间的 曼哈顿距离 : |xi - xj| + |yi - yj| ,其中 |val| 表示 val的绝对值。请你返回将所有点连接的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。=>解法

2021-01-19 18:59:35 306

原创 算法刷题笔记 - 通配符匹配(动态规划)

通配符匹配来源 : LeetCode - 通配符匹配难度 : 困难标签 : 动态规划题目描述给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。‘?’ 可以匹配任何单个字符。‘*’ 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功说明 :s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 

2021-01-18 19:51:59 198

原创 利用C++ Lambda优化多分支赋值

利用C++ Lambda优化多分支赋值我们经常需要根据不同的条件分枝来获取一个变量一共后续使用,通常我们会这么做。//...Type res;switch (val) {case val0: res = Type(...); break;case val1: res = Type(...); break;case val2: res = Type(...); break;case val3: res = Type(...); break;..}......//...上述代

2020-09-15 18:47:37 384

原创 极客时间 - 现代C++实战30讲期末测试盲点

极客时间 - 现代C++实战30讲期末测试盲点目前C++语言已经不允许在异常规约里描述函数会抛出什么异常,而只能声明函数是否会抛出异常。特殊成员函数不能是一个函数模板用户如果声明了拷贝构造函数、移动赋值函数或析构函数,编译器就不会隐式声明移动构造函数。MSVC是Windows上最主流的编译器,历史也最悠久。Clang的独特优势是其模块化的设计,第三方软件可以利用Clang来帮助分析C++代码Clang-Tidy是用于代码分析的,格式化工具是Clang-Format...

2020-09-15 12:11:10 1670

原创 C++ lambda表达式简介及作用

C++ lambda表达式简介C/C++的可调用对象在C语言中,可调用对象仅有函数指针。但在C++中,可调用对象增加了两类,其一是利用C++操作符重载实现的functor,functor本身是一个struct/class的实例,其特殊的地方在于重载了小括号(调用)操作符其二则是C++2.0引入的lambda表达式,也成为匿名函数,其语法为// lambda[ <捕获列表> ] ( <参数列表> ) [options] { <函数体> }// 返回值即为一

2020-09-04 14:17:47 2415

原创 在Qt-Creator可正常运行, 直接运行可执行文件有异常

在Qt-Creator可正常运行, 直接运行可执行文件有异常可能的一个原因 : 两种运行方式的工作目录不同,在Qt-Creator中运行时, 默认工作目录为build文件所在目录,但是执行.exe等可执行文件时目录为可执行文件所在目录,可能会导致某些资源文件或者数据库文件(尤其是数据库文件, 资源文件一般加载到资源文件中)加载失败. 另 : 使用windeployqt等添加打包时有可能会在对应的目录(相对目录)生成空的对应文件.方法: 将所要依赖的文件copy/move到相对于可执行文件的对应

2020-08-19 21:22:07 942

原创 使用C++手写栈 - Stack

使用C++手写栈在(一)中,对动态数组进行了简单的封装,实现了简易Vector, 这次不妨就来实际用一下我们的Vector。无论是否学过数据结构,你大概都会听说过"栈",栈最主要也是最重要的特性就是FILO – 先进后出,或者说,满足先进后出的就是栈(Stack),所以Stack与我们说的vector、list、map等不同,Stack只定义了一组操作,只要实现了这些操作就是所谓栈,底层的实现显得不那么重要。所以,我们先来定义一个接口IStack,然后再用其他的数据结构实现。一个栈所需的操作主要有

2020-08-15 14:33:29 1043

原创 离散数学 - 图论(3)-图的矩阵表示

图论(3)-图的矩阵表示设G=是有向图, 其中V={v1,v2,…,vnv_1 ,v_2 ,…,v_nv1​,v2​,…,vn​}, 并假定各结点已经有了从v1v_1v1​到vn的次序。定义一个n×n的矩阵∗∗A∗∗,其中各元素v_n的次序。定义一个n×n的矩阵**A**, 其中各元素vn​的次序。定义一个n×n的矩阵∗∗A∗∗,其中各元素a_{ij}$为[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j8p9r3lX-1597284496545)(en-resourc

2020-08-13 10:09:23 1140

原创 离散数学 - 图论(2)-路径和回路

图论(2)-路径和回路在有向图中,从顶点v0v_0v0​到顶点vnv_nvn​的一条路径是图中的边的序列, 其中每一条边的终点是下一条边的起点。一条路径中, 如果同一条边不出现两次, 则称此路径是简单路径。一条路径中,如果同一顶点不出现两次, 则称此路径是基本路径(或叫链)。如果路径的始点v0v_0v0​和终点vnv_nvn​相重合, 即v0v_0v0​=vnv_nvn​ , 则此路径称为回路,没有相同边的回路称为简单回路, 通过各顶点 不超过一次的回路称为基本回路。路径

2020-08-13 10:08:04 10381

原创 离散数学 - 图论(1)-图的基本概念

图论(1)-图的基本概念图的基本概念一个图G是一个二重组 <V,E>, 其中V是非空的节点(vertex)的集合, E是边(edge)的集合.若边e所对应的偶对<a, b>是有序的, 则称e是有向边。 有向边简称弧, a叫弧e的始点, b叫弧e的终点, 统称为e的端点。若边e所对应的偶对(a,b)是无序的, 则称e是无向边。每一条边都是有向边的图称为有向图。每一条边都是无向边的图称为无向图。如果在图中一些边是有向边,而另一些边是无向边,则称 这

2020-08-13 10:05:59 1851

原创 离散数学 - 偏序关系

偏序关系如果集合A上的二元关系R是自反的、反对称的和传递 的, 那么称R为A上的偏序, 称序偶<A, R>为偏序集合。偏序关 系R一般用 ≤ 表示设<A, ≤ >是偏序集,对任意的 x, y∈A, 如果 x < y 且 不存在 z∈A 使得 x < z < y, 则称 y 覆盖 x哈斯图: 利用偏序关系的自反、反对称、传递性进行简化的 关系图。1. 每个结点没有自回路2. 两个连通的结点之间的序关系通过结点位置的高低表示, 位置低的元素的顺

2020-08-13 10:05:09 12987

原创 离散数学 - 二元关系(续) - 关系的运算 & 等价关系和划分

二元关系-续关系的运算 & 等价关系和划分关系的运算关系的合成(1).设R1R_1R1​是A到B的关系,R2R_2R2​是B到C的关系,从A到C的合成关系记为R1R2R_1R_2R1​R2​定义为R1R2={<a,c>∣a∈A∧c∈C∧∃b(b∈B∧<a,b>∈R1∧<b,c>∈R2)}\small R_1R_2=\{<a, c>| a\in A\land c\in C\land\exists b(b\in B\land <a,

2020-08-13 10:04:41 3822

原创 离散数学 - 二元关系

二元关系基本概念AxBAxBAxB的子集叫做A到B的一个二元关系,当A=BA=BA=B时叫做A上的二元关系A1xA2xA2x...xAn(n>‾1)A_1xA_2xA_2x...xA_n(n\underline{>}1)A1​xA2​xA2​x...xAn​(n>​1)的子集叫做A1xA2xA2x...xAnA_1xA_2xA_2x...xA_nA1​xA2​xA2​x...xAn​上的一个n元关系An=A1xA2xA2x...xAn(n>‾1)A^n=A_1xA_2x

2020-08-13 10:03:22 3315

原创 离散数学 - 集合论

集合论主要内容集合的基本概念集合的运算有限集合的计数集合的笛卡尔积集合的基本概念什么是集合?集合可以理解成由离散的个体构成的整体.同时,成这些个体为集合的元素.常见的数集,有自然数集(N),整数集(Z),有理数集(Q),实数集®,复数集©.集合怎么表示?枚举–一个个列出来谓词表示法(类似于高中的描述法)–通过谓词概括集合的性质同样对于由1, 2, 3组成的集合,枚举法 {1,2,3}\{1, 2, 3\}{1,2,3}谓词法 {x∣1≤x≤3,x∈N}\{ x|

2020-08-13 10:02:39 673

原创 离散数学 - 谓词逻辑的推理

谓词逻辑的推理  在前面学习了命题逻辑的推理,但是用其却无法证明苏格拉底论证的有效性,这是由于原子命题包含的信息量太少,无法将苏格拉底论证的条件和结论准确的表示出来,因此,我们引入了谓词与量词.借助它们,我们能更精确的将自然语言转化为数学语言,而下一步,就是与命题逻辑的推理相对应的谓词逻辑的推理.主要内容:推理规则例题示范推理规则:全称量词的消去规则(US):全称量词的基本属性是"任意",也就是说,如果个体域的所有个体都具有性质A,则个体域中的任一个个体都具有性质A。公式:∀xA(x

2020-08-13 10:01:54 8038 4

原创 离散数学 - 谓词公式

谓词公式原子谓词公式定义:  由n原谓词P和n个个体变元x1, x2, …, xn构成的不包含 任何量词和命题联结词的式子P(x1, x2, …, xn )称为原子谓词公式。谓词公式递归定义:原子谓词公式P(x)P(x)P(x)是谓词公式;若P(x)是谓词公式,则∀P(x)\forall P(x)∀P(x),∃xP(x)\exists xP(x)∃xP(x) 也是谓词公式;若AAA, BBB是谓词公式,则¬A\neg A¬A , A∨BA\vee BA∨B, A∧BA\land BA∧B, A

2020-08-13 10:00:32 12241

原创 手写简易顺序表 - SimpleVector

使用C++手写简易顺序表在C++的STL中最常用的数据结构可谓是std::vector了, vector弥补了数组不可以动态扩展的缺陷并且保证了储存在连续的内存块中,使访问效率很高。std::vector就是标准的顺序表,类似的还有Java中的ArrayList,那么他们是如何实现的呢?这里,我们就来一起实现一个简易的顺序表。要说明的是我们的vector并不包含一些算法譬如sort,同时也不提供迭代器,前者属于算法的范畴,容易让我们关注点转移,后者需要符合STL中的迭代器的标准,涉及一些STL的高级

2020-08-12 22:17:58 230

原创 C++ inline关键字与g++报错undefined reference to ...

C++ inline关键字与g++报错undefined reference to …今天在Linux下编写select网络模型的程序时, 对fd_set进行了简易的封装, 文件有3个, 分别为main.cpp FDSet.cpp FDSet.h, 发现使用g++命令编译时死活编译不过,# 使用的命令g++ main.cpp FDSet.cpp -o main -I ./使用了很多方法报错均为/usr/bin/ld: /tmp/ccpLMDcl.o: in function `main':se

2020-08-12 20:38:00 1019

原创 C++中数组作为函数参数如何不用同时传入大小

C++中数组作为函数参数如何不用同时传入大小在C/C++中如果将数组作为参数传入函数通常需要同时传入数组的大小, 在使用时总是带着一个尾巴, 总是显得有些赘余.这是由于C/C++的原生数组实质上只是一个指针而已, 不像Java中的数组还带有一个存储大小的字段.那么, C++中就真的没法优雅的只传入数组吗?答案是否定的, 虽然C++的原生数组不算是对象, 没有将大小也封装到数组中, 但是, C++的模板为我们提供了一个新的思路.我们下面实现一个打印数组中所有元素的函数.先来看通常的做法//

2020-08-07 19:24:25 827

原创 Linux Socket编程使用inet_ntoa得到0.0.0.0

Linux Socket编程使用inet_ntoa得到0.0.0.0原因: 使用accept函数时, 传入的指向sockaddr的大小的指针没有初始化, 应该初始化为sizeof(sockaddr), 本以为大小指针是只写的, 看来有点自我臆想了

2020-08-07 09:06:44 474

原创 Qt 编译出现报错:multiple definition of something解决方法:

Qt 编译出现报错:multiple definition of something解决方法:由于多次引入头文件导致, 注意在*.h文件中使用头文件保护措施// file : header.h#ifndef __HEADER_H_#define __HEADER_H_// file body#endif*.pro文件中HEADERS+=或者是SOURCES+=了相同的文件, 将相同的文件去重即可# 例子SOURCES += \ src1.cpp \ src2.cpp

2020-08-07 00:25:17 1350 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除