程序最美(寻路)

你还在坚持练习你的技术吗?运动员天天训练,音乐家也会演练更难的曲章。你呢?

2013年9月26日

原码•反码•补码

摘要: 原码·反码·补码 本文可以说是比较水,主要是谈一下原码、反码、补码的东西。原码、反码、补码的定义我们这里不做介绍,可以Google之,查询相关Wiki或百度百科。 我们主要对一个数,如果转换为原码、反码、补码,并且如何由原码、反码、补码转换为原数。下面我们给出几种转换的代码实现,并对代码做一下解释。 需要说明的是,我们并没有对正数用原码负数用补码进行分开讨论,而是对正负数、无符号数都求了原码、反码、补码。关于原码、反码、补码的内部机制,为什么有产生这些,为什么会用它们,用它们有什么好处,我们也不做介绍,如果感兴趣的话可以参考《深入理解计算机系统》。 我们先给出相关的程序,然 阅读全文

posted @ 2013-09-26 22:43 unixfy 阅读(614) 评论(0) 推荐(0) 编辑

2013年9月25日

实现一个堆栈虚拟机

摘要: 实现一个堆栈虚拟机 本文我们实现一个基于堆栈的虚拟机,通过前面《简单虚拟机》和《栈虚拟机源码剖析》,对虚拟机结构和原理有了更深的理解和体会。下面我们给出堆栈虚拟机的示意图: 堆栈虚拟机主要包括以上三部分:虚拟机、指令集、外部接口。 其中虚拟机内部构造主要是数据、指令、堆栈三部分,指令对数据进行操作,将数据装载进堆栈中以备运算和处理。 指令集的设计可以参考别人的设计也可以按照自己的理解逐步扩充改进,主要有PUSH、POP、TOP、INPUT、OUTPUT、JMP、JMP_TRUE、JMP_FALSE、JMP_EQUAL、JMP_NOT_EQUAL、JMP_BIGGER、JMP_SMALLE... 阅读全文

posted @ 2013-09-25 00:15 unixfy 阅读(4359) 评论(0) 推荐(0) 编辑

2013年9月23日

栈虚拟机源码剖析

摘要: 栈虚拟机源码剖析 之前我们介绍过一个《简单虚拟机》,该虚拟机是基于寄存器的。 本文我们剖析一个栈虚拟机的源代码。该代码来自于《实现一个脚本引擎》中的《Part VII:虚拟机(The Virtual Machine)》,该栈虚拟机的源代码下载地址为:source code。 虚拟机的实现方式有三种:内存、堆栈、寄存器。 该虚拟机主要包含三部分:一个指令数组、一个字符串表、一个堆栈:成员说明指令数组存储程序所包含的指令字符串表实质上是一个指针数组,代表程序的一个变量或者堆栈中的一个临时变量堆栈有整数组成,指向字符串表,以表示什么字符串在堆栈中(这里使用的是整数,而非字符串类的指针);堆栈还... 阅读全文

posted @ 2013-09-23 22:55 unixfy 阅读(1826) 评论(0) 推荐(0) 编辑

2013年9月22日

前缀表达式的计算

摘要: 前缀表达式的计算 前面我们曾对《后缀表达式的计算》做过讨论。后缀表达式的计算过程是首先设定一个操作数栈,顺序扫描整个后缀表达式,如果遇到操作数,则将操作数压栈;如果遇到操作符,则从操作数栈中弹出相应的操作数进行运算,并将运算结果进行压栈。当将整个后缀表达式扫描完毕时,操作数栈中应该只有一个元素,该元素的值即为后缀表达式的计算结果。 对于一个后缀表达式:1 2 3 + - 其对应的前缀表达式为:-1 + 2 3 前缀表达式的计算方法与后缀表达式的计算方法类似。对前缀表达式从后向前扫描,设定一个操作数栈,如果是操作数,则将其直接入栈,如果是操作符,则从栈中弹出操作符对应的操作数进行运算,并将计算结 阅读全文

posted @ 2013-09-22 22:55 unixfy 阅读(12235) 评论(0) 推荐(1) 编辑

ASCII码表以及不同进制间的O(1)转换

摘要: ASCII码表以及不同进制间的O(1)转换 一、ASCII码表 ASCII全称为American Standard Code for Information Interchange,美国信息交换标准代码。其值范围为0-127,总共128个字符。 下面我们对着128个字符进行输出,分为五列:二进制、八进制、十进制、十六进制、字符。具体程序如下:// 生成ASCII码表#include #include #include using namespace std;string IntTo_(int num, int radix, string& ret){ int index = ret.s 阅读全文

posted @ 2013-09-22 21:42 unixfy 阅读(1029) 评论(0) 推荐(1) 编辑

2013年9月18日

四则运算表达式的语法分析

摘要: 四则运算表达式的语法分析 本文参考自vczh的《如何手写语法分析器》。 之前有《语法分析器初步学习——LISP语法分析》也是参考自《如何手写语法分析器》。 通过语法规则表达操作符的优先级。 四则运算表达式的语法为: 1.Term = | “(”Exp”)” 2.Factor = Term ((“*” | “/”) Term)* 3.Exp = Factor ((“+” | “-”) Factor)* 根据语法写代码。这里不对四则运算表达式求值,而是将其转换为等价的Lisp表达式,然后输出。 具体的代码如下:// 四则运算表达式的语法分析——生成LISP表达式#include #include. 阅读全文

posted @ 2013-09-18 23:14 unixfy 阅读(2967) 评论(0) 推荐(0) 编辑

2013年9月15日

语法分析器初步学习——LISP语法分析

摘要: 语法分析器初步学习——LISP语法分析 本文参考自vczh的《如何手写语法分析器》。 LISP的表达式是按照前缀的形式写的,比如(1+2)*(3+4)在LISP中会写成(*(+ 1 2)(+ 3 4)),1 + 2会写成(+ 1 2)。 LISP语言的语法如下形式:1.Operator = “+” | “-” | “*” | “/” 2.Expression = | ”(”Expression”)” | “(”Operator Expression Expression”)” 我们根据以上两条语法规则来写代码:// LISP语法分析器#include #include using names. 阅读全文

posted @ 2013-09-15 21:58 unixfy 阅读(2379) 评论(0) 推荐(0) 编辑

2013年9月14日

ASC与HEX之间的转换

摘要: ASC与HEX之间的转换 有这么两个函数:函数原型功能返回值参数备注hex2asc__int16 hex2asc(unsigned char *strhex,unsigned char *strasc,__int16 length);字符串转换函数,十六进制字符转换成普通字符成功则返回 0,否则返回非0strhex:要转换的字符strasc:转换后的字符length:字符strasc的长度长转短asc2hex__int16 asc2hex(unsigned char *strasc,unsigned char *strhex,__int16 length);字符串转换函数,普通字符转换成十六进 阅读全文

posted @ 2013-09-14 14:40 unixfy 阅读(10796) 评论(1) 推荐(0) 编辑

2013年9月12日

字节存储数据

摘要: 字节存储数据 一个字节有8个bit,一个int一般情况下有32个bit(4个字节),一个long有64个bit(8个字节)。 对于一个数据:0123456789 我们可以用10个int来存储,共占用40个字节。如果用10个long来存储,则共占用80个字节,如果用10个char来存储,则共占用10个字节。 int有32个bit,其表示范围为2^(-31)~2^31-1 long有64个bit,其表示范围为2^(-63)~2^63-1 char有8个bit,其表示范围为2^(-7)~2^7-1,如果是unsigned char,其表示范围为0~2^8-1 显然int、long、char的表示能力 阅读全文

posted @ 2013-09-12 22:06 unixfy 阅读(1596) 评论(0) 推荐(0) 编辑

进制之间的转换

摘要: 进制之间的转换一、谈谈几个库函数函数原型功能参考atoiint atoi(const char* nptr);把字符串换化成整型数百度百科itoachar* itoa(int value, char* string, int radix);将整型数转换为radix进制数的字符串形式百度百科atollong atol(const char* nptr);把字符串转换成长整型数百度百科atofdouble atof(const char* nptr);把字符串转换成浮点数百度百科strtoddouble strtod(const char* nptr, char** endptr);把字符串转换成 阅读全文

posted @ 2013-09-12 16:42 unixfy 阅读(758) 评论(0) 推荐(0) 编辑

导航