汇编语言是各种CPU提供的机器指令的助记符的集合,人们可以用汇编语言直接控制硬件系统进行工作。汇编语言是人和计算机沟通的最直接方式,它描述了机器最终要执行的指令序列。学汇编的目的:充分获得底层编程的体验,深刻理解机器运行程序的机理。以8086CPU来学习。 机器语言:早期程序员使用,难于辨别和记忆 机器指令的集合,机器指令就是一台计算机可以正确执行的命令:一列二进制数字。 计算机将之转换为高低电平,以使计算机的电子器件收到驱动,进行计算。 汇编语言: 主体是汇编指令,汇编指令是机器指令便于程序员记忆的书写格式,是机器指令的助记符。 每一种CPU都有自己的汇编指令集。 汇编语言的组成: (1):汇编指令:机器码的助记符,同机器码一一对应。(核心->汇编语言的特性) (2):伪指令:没有对应的机器码,由编译器执行,计算机不执行。 (3):其他符号:如+、-、*、/等,由编译器识别,没有对应的机器码。 存储器: 存放计算机可以直接使用的信息。指令和数据在存储器存放,也就是内存。在PC机上,内存的作用仅次于CPU。磁盘不同于内存,磁 继续阅读 >>


杜肖孟 16/11/15 17:07:57
x&(x-1) 现在令 x = 10101000,接下来我们算一下 x&(x-1)的结果。 首先我们回忆一下二进制减法的规则: 0-0=1-1=0 1-0=1 0-1=1(向高位借位) 例如,(11000011)2-(00101101)2的算式如下: 11000011 被减数 00101101 减数 --1111 借位 (减号是对齐美观用的) ------------------- 10010110 差数 回到刚才的运算,根据二进制减法的规则,我们得: x-1 = 10100111, & x  = 10101000, x & (x-1) = 10100000 我们可以看出,x的最右边的1变成了0,如果我们继续对得到的结果再次执行这样的运算时,发现结果又变为 10000000,由此我们得到结论:x&(x-1) 是将二进制数最右边的1变成0,如果没有1则生成的二进制位全为0。 ??? 我们看下面程序会输出什么 ??? #include<stdio.h&g 继续阅读 >>


杜肖孟 16/11/10 14:39:32
  一个容器就是一些特定类型对象的集合。顺序容器为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应。 顺序容器的概述 下表列出了标准库中的顺序容器,所有顺序容器都提供了快速顺序访问元素的能力。但是不同容器在一下方面都有不同程度的性能折中。 向容器添加或删除元素的代价 非顺序访问容器元素的代价 顺序容器类型 vector ------ 可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢 deque ------双端队列。支持快速随机访问。在头尾位置插入删除速度很快 list --------双向链表。只支持双向顺序访问。在list中任何位置进行插入删除操作速度都很快 forward_list ----单向链表。只支持单向顺序访问。在链表任何位置进行插入删除速度都很快 array--------固定大小数组。支持快速随机访问。不能添加或删除元素 string--------与vector相似的容器,但专门用来保存字 继续阅读 >>


杜肖孟 16/11/08 23:44:21
首先定义节点 typedef struct BTree { int value; struct BTree *lchild; struct BTree *rchild; }BTree; 前序递归建立二叉树 /* **num 前序序列 **index 下标 */ BTree *CreateBTree(BTree *node,int *num,int& index) { if(num[index] == 0) return NULL; else { node = new BTree; node -> value = num[index]; node -> lchild = CreateBTree(node->lchild,num,++index); node -> rchild = CreateBTree(node->rchild,num,++index); } 继续阅读 >>


杜肖孟 16/10/29 17:02:43
  C++不直接处理输入输出,而是通过一族定义在标准库中的类型来处理IO。这些类型支持从设备读取数据、向设备写入数据的IO操作,设备可以是文件、控制台窗口等。还有一些类型允许内存IO,即从string读取数据,向string写入数据。 IO类 头文件 类型 iostream istream,wistream从流读取数据 ostream,wostream向流写入数据 iostream,wiostream 读写流 fstream ifstream,wifstream从文件读取数据ofstream,wofstream 向文件写入数据 fstream,wfstream 读写文件 sstream istringstream,wistringstream从string读取数据 ostringstream,wostringstream 向string写入数据 stringstream,wstringstream 读写string ps:为了支持使用宽字符的语言,标准库定义 继续阅读 >>


杜肖孟 16/10/28 21:15:59
ping命令   Linux系统ping命令是常用的网络命令,用来测试网络的连通性,向网络上的主机发送应答请求,根据响应信息可以判断远程主机是否可用 。ping命令通过将 icmp 回显数据包发送到计算机并侦听回显回复数据包来验证与一台或多台远程计算机的连接,该命令只有在安装了 tcp/ip 协议后才可以使用。通常我们打不开网页时就会说”ping 一下”。 语法: ping [参数] [主机名或ip地址] 参数说明: -a 将地址解析为计算机名。 -d 使用Socket的SO_DEBUG功能。 -c<完成次数> 设置完成要求回应的次数。 -f 极限检测。 -i<间隔秒数> 指定收发信息的间隔时间。 -I<网络界面> 使用指定的网络界面送出数据包。 -l<前置载入> 设置在送出要求信息之前,先行发出的数据包。 -n 只输出数值。 -p<范本样式> 设置填满数据包的范本样式。 -q 不显示指令执行过程,开头和结尾的相关信息除外。 -r 忽略普通的Routing Table,直接将数据包送 继续阅读 >>


杜肖孟 16/10/20 17:51:23
运算符重载的概念和语法 重载,就是赋予新的含义,运算符重载和函数重载类似,同一个运算符可以有不同的功能。 运算符重载的方式就是定义一个函数,在函数体内实现想要的功能,当用到该运算符时,编译器就会自动调用这个函数。也就是说,运算符重载就是通过函数定义实现的,它本质上是函数重载。 返回值类型 operator 运算符名称(形参列表){ //TODO; } operator是关键字,专门用于定义重载运算符的函数。 重载运算符的规则: 1):并不是所有运算符都可以重载。例如长度运算符(sizeof)、条件运算符(: ?)、成员选择符(.)、对象选择符(.*)、域解析符(::)不能被重载。 2):重载不能改变运算符的优先级和结合性。 3):重载不会改变运算符的用法。例如"+"号总是出现在两个操作数之间。 4):重载运算符的函数不能有默认的参数,否则就改变了运算符操作数的个数,显然是错误的。 下面的代码定义了一个复数类,通过运算符重载,用”+”号实现了复数的加法。 /************************************ 继续阅读 >>


杜肖孟 16/10/20 14:40:11
何为二叉堆? 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者近似完全二叉树。二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左右子树都是一个二叉堆。 当父节点的键值总是大于或等于任何一个子节点的键值时为最大堆(大顶堆)。 当父节点的键值总是小于或等于任何一个子节点的键值时为最小堆(小顶堆)。 根据二叉树的性质,可得: 1. 如果根节点在数组的位置是1,第n个位置的子节点分别在2n和2n+1,第n个位置的双亲节点在[i/2]。因此,第1个位置的子节点在2和3。 2. 如果根节点在数组的位置是0,第n个位置的子节点分别在2n+1和2n+2,第n个位置的双亲节点在[(i-1)/2]。因此,第0个位置的子节点在1和2。 二叉堆一般用数组来表示,得益于数组的随机存储能力,我们能够很快确定堆中节点的父节点和子节点。 在本文中,我们主要介绍大顶堆的C++模板实现过程,以根节点在0位置存储为例。 二叉堆的具体实现 1. 二叉堆的抽象数据类型 /*大顶堆类定义*/ template <typename T> 继续阅读 >>


杜肖孟 16/10/15 17:21:53
何为二叉查找树? 二叉查找树也称为二叉搜索树或二叉排序树。二叉排序树的节点包含键值key。二叉排序树或者是一棵空树,否则要求: 1.若它的左子树不为空,那么左子树上所有节点的key都小于根节点的key 2.若它的右子树不为空,那么右子树上所有节点的key都大于根节点的key 3.它的左右子树也分别为二叉排序树 从定义得,二叉查找树中没有重复key值的节点。 二叉查找树的构建 节点结构 template <typename T> struct BSNode { //初始化 只赋予权值 BSNode(T t):value(t),lchild(NULL),rchild(NULL) {} //BSNode() = default; T value; //节点的值 BSNode<T>* lchild; //左孩子 BSNode<T>* rchild; //右孩子 BSNode<T>* parent; //节点的 继续阅读 >>


杜肖孟 16/10/14 19:09:43
  哈夫曼树又称最优二叉树,是带权路径长度最短的树,可用来构造最优编码,用于信息传输、数据压缩等方面,是一种应用广泛的二叉树。 几个相关的基本概念: 1.路径:从树中一个结点到另一个结点之间的分支序列构成两个节点间的路径 2.路径长度:路径上的分支的条数称为路径长度 3.树的路径长度:从树根到每个结点的路径长度之和称为树的路径长度 4.结点的权:给树中结点赋予一个数值,该数值称为结点的权 5.带权路径长度:结点到树根间的路径长度与结点的权的乘积,称为该结点的带权路径长度 6.树的带权路径长度:树中所有叶子结点的带权路径长度之和,通常记为WPL 7.最优二叉树:在叶子个数n以及各叶子的权值确定的条件下,树的带权路径长度WPL值最下的二叉树称为最优二叉树。 哈夫曼树的建立 由哈夫曼最早给出的建立最优二叉树的带有一般规律的算法,俗称哈夫曼算法。描述如下: 1):初始化:根据给定的n个权值(W1,W2,…,Wn),构造n棵二叉树的森林集合F={T1,T2,…,Tn},其中每棵二叉树Ti只有一个权值为Wi的根节点,左右子树均为空。 继续阅读 >>


杜肖孟 16/10/13 17:46:55