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

原创 所有文章目录
博客一般都是基于标签分类的,文章则是按发表时间排序。为方便查找文章,这里按章节目录形式给出文章索引,按文章内容排序。//xk>----------------------------------------------------------------------------------------------------[01. Software Design][02. 数据结构和
2012-04-21 10:52:03
813
原创 linux内核中的container_of宏
//xk> 引子 首先看一个简单的面试题:定义一个宏FIND(stru, e),求结构体stru中某个成员e相对于stru的偏移量。 题目的解答很简单:#define FIND(stru, e) &(((stru *)0)->e)将常量0强制类型转化为stru *类型的指针。因为结构体的首地址为0,所以其成员的地址即为相对于结构体的偏移量。
2012-07-03 22:11:31
1076
原创 extern关键字
extern关键字最原始的用处是变量声明,这里不细说。 //xk> 在C++程序中调用C编译器编译的函数 我们知道,在C++程序中可以直接调用C语言写的函数,不仅在语法上C++编译器基本可以编译C程序,而且C++程序还可以调用C编译器编译好了的函数,不过要加上extern "C". 因为C++支持函数重载,这就造成C++编译器和C编译器
2012-07-02 14:56:13
805
原创 面试题:两个变量的最大值、最小值和变量交换
//xk> 例题 【题目】不用if, ?: , switch等判断语句,找出两个给定变量中的最大值和最小值 【解答】要注意直接a + b可能导致溢出。 下面的解答来自《程序员面试宝典》第二版,很明显存在溢出问题。不过这种思路有点意思。int max = (a + b + abs(a - b)) >> 1;int min = (a +
2012-07-02 14:43:15
3192
原创 面试题:二进制表示中1的个数。
//xk> 例题 【题目】用一个表达式判断一个数X是否是2的N次方。不能用循环语句。 【解答】在面对很多问题的时候,人与人之间的差距不仅仅表现在聪明才智,更表现在专业程度。或言之,绝对智商上差距的影响是微乎其微的,绝大程度上是依赖于:是否更加经验丰富,是否更加训练有素。 就像这个题目,知道的人就知道是一个很小的技巧,第一次见的人就很可能想破脑袋
2012-07-02 14:06:37
785
原创 堆排序
//xk> 什么是堆? 堆的结构满足两点性质:1. 堆是一棵完全二叉树。2. 任意节点的值小于它的所有后代。 性质2又称为堆序(heap order)性。节点值小于后代的堆即为小根堆,显然其根节点的值是最小的。相对地有大根堆。小根堆常用于XXX,大根堆常用于XXX。 不要求堆是满二叉树。也不要求其节点左孩子的值小于右孩子,堆不必要是二叉排序树(
2012-06-27 16:47:39
1144
原创 linux kernel中的编码技巧:将运行期错误提前为链接报错
//xk> 缘起 《深入Linux内核架构》P144页。读书存疑,继而想通。 //xk> 铺垫 虚拟地址空间一般按3:1划分为进程地址空间和内核地址空间,32位机器4G的虚拟地址空间就有1G分为内核地址空间。 (1) 内核地址空间前896M是直接映射的物理页帧,即物理内存上的896M能直接映射(通过线性偏移0xC000
2012-06-22 13:58:29
1334
原创 区别指针类型与所指对象的类型
看个例题#include intmain(){ unsigned int a = 0xfffffff7; char *b = (char *)&a; printf("%08x\n", *b); return 0;} 强制用一个char *类型的指针指向对象a,一般我们认为其代表的含义是:当通过指针b来访问对象a时,把对象a当成char类型
2012-06-21 18:59:06
2075
原创 i386体系结构
所谓的32位、64位CPU指的是CPU的算术逻辑单元通用寄存器的位数。 Intel公司的80386是一个里程碑式的产品,之后的486、Pentium、Pentium II虽然在性能上有不小的改进,但都属于同一种体系结构,统称为i386结构。 为了与以往产品兼容,80386选择了在段寄存器的基础之上构建保护模式,段寄存器仍为16位,新增两个段寄存器FS和GS。为了
2012-05-15 20:54:20
2348
原创 快速排序
快速排序可以看成对冒泡排序的一种改进。基本思想是:通过一趟排序将待排序列分为两部分,其中一部分的值均比另一部分的值要小,然后分别对这两部分继续进行排序。 算法过程举例说明如下,假设输入为:8149635270 (1) 用三数中值分割法取一个pivot。从头、中间、尾取3个数分别为8, 6,
2012-04-23 20:30:56
585
原创 [07. C++]文章目录
常用关键字 const关键字 static关键字 extern关键字 struct关键字在C和C++中使用时的一点区别 goto的一个典型应用场景I/O I/O流使用小细节未分类 内存对齐 成员函数的地址
2012-04-22 12:47:48
576
原创 [03. Unix Linux]文章目录
编程基础 linux内核中的container_of宏进程 僵尸进程详解内存管理 linux kernel中的编码技巧:将运行期错误提前到链接报错文件 Unix文件系统信号 POSIX信号处理多线程 Linux多线程机制未分类 i386体系结构 Linux系统启动流程
2012-04-22 12:45:39
619
原创 字符串反转
源代码如下:#include using std::cout;using std::endl;//xk> 字符串翻转voidrevertString(char * str, int N){ int i =0, j = N - 1; while(i < j){ str[i] ^= str[j] ^= str[i] ^= str[j]; // 这样写发生异常,因为字符串是常量
2012-04-21 14:39:39
1030
1
原创 二分查找
二分查找是对已经排序好的序列进行查找。因为这个程序非常经典地简单又容易出错,所以在当着面试官纸上写程序的场合这个程序的命中率非常高。 源码如下:#include using std::cout;using std::endl;//xk> 二分查找//xk>--------------------------------------------------//
2012-04-21 14:13:39
684
原创 goto的一个典型应用场景
最近写一个遗传算法,采用部分匹配交叉策略,假设两条染色体是:X : 2 3 4 5 6 7 8 1Y : 1 2 3 4 5 6 7 8交叉点i = 2, j = 6, 即中间的4个基因进行交换X : 2 3 3 4 5 6 8 1Y : 1 2 4 5 6 7 7 8这样将产生重复基因,所以需要对交叉片段之外的基因按
2012-04-20 21:18:07
1231
原创 I/O流使用小细节
在使用标准库提供的I/O流时,我们常常通过判断文件流状态来进行循环控制。例如ifstream ifStr("MyFile.txt"); // 要使用绝对路径string str;if(ifStr >> str){ cout }将MyFile.txt中内容逐个单词地输出。 但是像下面这样写就是错的:if
2012-04-19 12:58:21
777
原创 Python怎样用C实现对象的多态性
在Python中,一切皆为对象,所有的对象都有一些相同的内容,在PyObject中定义。 //xk> 怎样实现继承 PyObject是Python中一切(new style)类的基类,其定义非常简单//xk> Python3.2.2_Source/Include/Object.htypedef struct _object {
2012-04-04 16:42:07
1724
原创 僵尸进程详解
//xk> 铺垫1:fork()和exec Unix中派生一个新的进程的唯一方法是fork()函数(有些系统可能提供它的各种变体)。父进程中打开的所有描述符在fork()之后由子进程分享。 存放在硬盘上的程序文件能够被Unix执行的唯一途径是:由一个现有进程调用exec函数中的某一个(exec函数有6个,作用相同,调用参数不同)。exec不会创建一个新的进程,而
2012-03-25 18:55:13
990
原创 遗传算法
某种程度上,遗传算法和穷举法相似,都是在解空间里面搜索最优解。但是与穷举法不同,遗传算法是一种概率搜索算法,能以更高的概率检索到较优解。因此在某些场合,使用穷举法是不现实的,但是用遗传算法却可以一试。 某种程度上,遗传算法跟贪心法相似,都是尽量使解最优化。贪心法是将解决问题的过程串联地分为很多步,在每一步尽量使解最优化。遗传算法是将解决问题的过程迭代地分为很多步,在每一代尽量使解
2012-03-22 16:13:19
1516
原创 C++ : const关键字
const关键字并不是表示常量,而是表示“内容不可修改”。const修饰的变量并不一定是值保持不变的,可能由编译器检测不到的外部条件改变,const可以和volatile同时修饰一个变量。 const与#define相比较是面试中常见的问题。#define定义常量,由预处理器进行字符替换,编译器不进行类型安全检查。const定义的是一个值恒定的变量,编译器会对其进行类型安全检查。
2012-03-20 19:16:20
623
原创 隐藏的<tbody>
用Javascript实现一个类似Excel表格的功能:输入一行表格后,点击一个按钮,在表格最下面增加一行以便用户继续输入一行数据。 属性从略 可增长表格 Javascript代码如下
2012-03-19 19:39:15
2292
原创 Javascript : 变量存放的是引用还是值
Javascript中,如果将一个基本数据类型的值赋给一个变量,变量中存放的是值;如果将一个对象赋给一个变量,变量中存放的是该对象的引用。 注意:Javascript中字符串类型是基本数据类型。 与基本数据类型字符串、数值、布尔类型相对应的是String对象、Number对象、Boolean对象。 将一个变量赋值为字符串后,可以对该变量使用St
2012-03-17 20:22:10
2683
1
原创 Google File System学习笔记
先贴上GFS Architecture示意图: Google云架构是基于Google公司的实际应用需求而设计的,主要针对大型分布式数据密集型应用。因为这个设计太给力了,所以Apache基金会实现了一个开源版本,就是Hadoop,目前貌似Hadoop性能只有Google商业版的1/10。 如上图,数量众多的数据密集型应用通过GFS client接口,使用f
2012-03-15 20:11:51
1382
原创 Unix文件系统
Unix文件系统有多种实现,下文主要讨论基于BSD的UFS(UNIX File System)。 一般硬盘被分为多个分区,每个分区可以包含一个文件系统。文件系统的结构一般如下:自举块 | 超级块 | 柱面组0 | 柱面组1 | …… | 柱面组n其中,柱面组i的结构如下:超级块副本 | 配置信息 | i-node图 | 块位
2012-03-11 16:49:14
2276
原创 内存对齐
执行内存分配的操作是在操作系统内核中,但一般认为内存对齐是编译器的事。因为操作系统和编译器都有默认的对齐系数,但是可以通过编译器来进行修改。比如cl.exe可以通过#pragma pack(n) // n = 1, 2 , 4, 8, 16来指定对齐系数。 需要内存对齐的原因,主要是从性能方面考虑,数据结构(尤其是栈)需要在自然边界上对齐
2012-03-09 16:25:12
662
原创 Linux系统启动流程
我们从按下电脑电源键开始说起。 (1) 首先是主板BIOS通电自检。按照《微机原理》课本上的说法,CS寄存器被置为0xFFFF,其它寄存器清零,因此CPU从FFFF:0000H处开始执行,这里保存的是跳转指令,跳转到固化在ROM中的自检程序处。于是对系统硬件包括内存进行自检。 当BIOS检查到硬件正常并且与CMOS的设置相符后,按照CMOS 中对启动设备的设置顺
2012-03-03 13:38:21
965
原创 用Raw socket自己构造数据包头部
一、原始套接字的创建 只有超级用户才能创建原始套接字。int sockFd;sockFd = socket(AF_INET, SOCK_RAW, protocol); 其中第3个参数protocol是形如IPPROTO_xxx的某个常值,在头文件中定义,经常不为0。 原始套接字不存在端口号的概念。
2012-02-29 21:01:30
10914
原创 socket编程概述
一、套接字地址结构 说套接字编程,第一个就是套接字地址结构。通用的套接字地址结构定义如下:#include struct sockaddr{ uint8_t sa_len; sa_family_t sa_family; // address family : AF_XXX char sa_data[14];};
2012-02-29 15:53:19
824
原创 C++ : static关键字
自C语言以来,static就是个容易让人迷惑的关键字,因为根据使用场合的不同,它表示两种差别甚远的意义。 《C和指针》一书给出精要的解释:用于函数定义,或者用于代码块之外的变量声明 表示修改标识符的链接属性,从external改为internal。但标识符的存储类型和作用域不受影响。用这种方式声明的函数或变量只能在声明它们的源文件中访问。当sta
2012-02-29 15:51:55
603
原创 vim使用笔记
一、vim还是emacs vim还是emacs? java还是C++? qt还是gtk? 争论是毫无意义的,谁好谁坏,孰对孰错,本没有绝对的标准。适合你的就是最好的。学习要快乐,不要纠结。 有一段时间听说emacs下有个写wiki的mode很方便,我也试着用了下emacs,但最终还是选择了vim。主要是两方面的原因:一、我先遇到vim。“正因为你为你的玫瑰花费了
2012-02-22 15:36:53
877
原创 struct关键字在C和C++中使用时的一点区别
很多同学在初学socket编程的时候,编译书上的第一个例子程序都会遇到这样一个问题,明明头文件都包含了,为什么编译总是报错:'sockaddr_in' undeclared'sockaddr' undeclared. 原因如下: 如果用gcc client.c -o client -Wall编译,则 struct sockadd
2012-02-02 12:44:18
1601
原创 VS2005设置Debugging information
用了快3年的XP崩溃了。现在连Vista都被微软抛弃了,而且Win7也确实慢慢成为主流的Windows系统,于是我也安装了个Win7。 在Win7下重装VS2005,提示有兼容性问题。上网查了下,问题不大,一般使用没有影响,要解决需要安装VS2005升级到Vista版的补丁。无视之,出了问题再说。打上VS2005SP1补丁。 编程,调试,出问题了,总是弹出对话框
2011-12-11 20:04:06
3178
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人