自定义博客皮肤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)
  • 收藏
  • 关注

原创 所有文章目录

博客一般都是基于标签分类的,文章则是按发表时间排序。为方便查找文章,这里按章节目录形式给出文章索引,按文章内容排序。//xk>----------------------------------------------------------------------------------------------------[01. Software Design][02. 数据结构和

2012-04-21 10:52:03 759

原创 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 983

原创 extern关键字

extern关键字最原始的用处是变量声明,这里不细说。        //xk> 在C++程序中调用C编译器编译的函数        我们知道,在C++程序中可以直接调用C语言写的函数,不仅在语法上C++编译器基本可以编译C程序,而且C++程序还可以调用C编译器编译好了的函数,不过要加上extern "C".        因为C++支持函数重载,这就造成C++编译器和C编译器

2012-07-02 14:56:13 731

原创 面试题:两个变量的最大值、最小值和变量交换

//xk> 例题        【题目】不用if, ?: , switch等判断语句,找出两个给定变量中的最大值和最小值        【解答】要注意直接a + b可能导致溢出。        下面的解答来自《程序员面试宝典》第二版,很明显存在溢出问题。不过这种思路有点意思。int max = (a + b + abs(a - b)) >> 1;int min = (a +

2012-07-02 14:43:15 3061

原创 面试题:二进制表示中1的个数。

//xk> 例题        【题目】用一个表达式判断一个数X是否是2的N次方。不能用循环语句。        【解答】在面对很多问题的时候,人与人之间的差距不仅仅表现在聪明才智,更表现在专业程度。或言之,绝对智商上差距的影响是微乎其微的,绝大程度上是依赖于:是否更加经验丰富,是否更加训练有素。        就像这个题目,知道的人就知道是一个很小的技巧,第一次见的人就很可能想破脑袋

2012-07-02 14:06:37 698

原创 堆排序

//xk> 什么是堆?        堆的结构满足两点性质:1. 堆是一棵完全二叉树。2. 任意节点的值小于它的所有后代。        性质2又称为堆序(heap order)性。节点值小于后代的堆即为小根堆,显然其根节点的值是最小的。相对地有大根堆。小根堆常用于XXX,大根堆常用于XXX。        不要求堆是满二叉树。也不要求其节点左孩子的值小于右孩子,堆不必要是二叉排序树(

2012-06-27 16:47:39 1058

原创 linux kernel中的编码技巧:将运行期错误提前为链接报错

//xk> 缘起        《深入Linux内核架构》P144页。读书存疑,继而想通。        //xk> 铺垫        虚拟地址空间一般按3:1划分为进程地址空间和内核地址空间,32位机器4G的虚拟地址空间就有1G分为内核地址空间。        (1) 内核地址空间前896M是直接映射的物理页帧,即物理内存上的896M能直接映射(通过线性偏移0xC000

2012-06-22 13:58:29 1251

原创 [06. C]文章目录

运算符    面试题:两个变量的最大值、最小值和变量交换    面试题:二进制表示中1的个数指针    区别指针类型与所指对象的类型

2012-06-21 19:00:40 543

原创 区别指针类型与所指对象的类型

看个例题#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 1968

原创 i386体系结构

所谓的32位、64位CPU指的是CPU的算术逻辑单元通用寄存器的位数。        Intel公司的80386是一个里程碑式的产品,之后的486、Pentium、Pentium II虽然在性能上有不小的改进,但都属于同一种体系结构,统称为i386结构。        为了与以往产品兼容,80386选择了在段寄存器的基础之上构建保护模式,段寄存器仍为16位,新增两个段寄存器FS和GS。为了

2012-05-15 20:54:20 2187

原创 Linux多线程

知识总结计划中……

2012-04-24 14:19:20 559

原创 快速排序

快速排序可以看成对冒泡排序的一种改进。基本思想是:通过一趟排序将待排序列分为两部分,其中一部分的值均比另一部分的值要小,然后分别对这两部分继续进行排序。        算法过程举例说明如下,假设输入为:8149635270        (1) 用三数中值分割法取一个pivot。从头、中间、尾取3个数分别为8, 6,

2012-04-23 20:30:56 494

原创 [07. C++]文章目录

常用关键字    const关键字    static关键字    extern关键字    struct关键字在C和C++中使用时的一点区别    goto的一个典型应用场景I/O    I/O流使用小细节未分类    内存对齐    成员函数的地址

2012-04-22 12:47:48 500

原创 [03. Unix Linux]文章目录

编程基础    linux内核中的container_of宏进程    僵尸进程详解内存管理    linux kernel中的编码技巧:将运行期错误提前到链接报错文件    Unix文件系统信号    POSIX信号处理多线程    Linux多线程机制未分类    i386体系结构    Linux系统启动流程

2012-04-22 12:45:39 556

原创 [02. 数据结构和算法]文章目录

字符串处理    字符串反转链表树排序和查找    二分查找    堆排序    快速排序遗传算法    遗传算法

2012-04-22 12:15:44 656

原创 字符串反转

源代码如下:#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 938 2

原创 二分查找

二分查找是对已经排序好的序列进行查找。因为这个程序非常经典地简单又容易出错,所以在当着面试官纸上写程序的场合这个程序的命中率非常高。        源码如下:#include using std::cout;using std::endl;//xk> 二分查找//xk>--------------------------------------------------//

2012-04-21 14:13:39 606

原创 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 1146

原创 I/O流使用小细节

在使用标准库提供的I/O流时,我们常常通过判断文件流状态来进行循环控制。例如ifstream ifStr("MyFile.txt");  // 要使用绝对路径string str;if(ifStr >> str){    cout }将MyFile.txt中内容逐个单词地输出。        但是像下面这样写就是错的:if

2012-04-19 12:58:21 680

原创 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 1653

原创 C++ : 成员函数的地址

(知识总结计划中……)

2012-03-26 20:43:38 610

原创 僵尸进程详解

//xk> 铺垫1:fork()和exec        Unix中派生一个新的进程的唯一方法是fork()函数(有些系统可能提供它的各种变体)。父进程中打开的所有描述符在fork()之后由子进程分享。        存放在硬盘上的程序文件能够被Unix执行的唯一途径是:由一个现有进程调用exec函数中的某一个(exec函数有6个,作用相同,调用参数不同)。exec不会创建一个新的进程,而

2012-03-25 18:55:13 918

原创 POSIX信号处理

(知识整理计划中……)

2012-03-24 22:01:32 862

原创 遗传算法

某种程度上,遗传算法和穷举法相似,都是在解空间里面搜索最优解。但是与穷举法不同,遗传算法是一种概率搜索算法,能以更高的概率检索到较优解。因此在某些场合,使用穷举法是不现实的,但是用遗传算法却可以一试。        某种程度上,遗传算法跟贪心法相似,都是尽量使解最优化。贪心法是将解决问题的过程串联地分为很多步,在每一步尽量使解最优化。遗传算法是将解决问题的过程迭代地分为很多步,在每一代尽量使解

2012-03-22 16:13:19 1150

原创 C++ : const关键字

const关键字并不是表示常量,而是表示“内容不可修改”。const修饰的变量并不一定是值保持不变的,可能由编译器检测不到的外部条件改变,const可以和volatile同时修饰一个变量。        const与#define相比较是面试中常见的问题。#define定义常量,由预处理器进行字符替换,编译器不进行类型安全检查。const定义的是一个值恒定的变量,编译器会对其进行类型安全检查。

2012-03-20 19:16:20 529

原创 隐藏的<tbody>

用Javascript实现一个类似Excel表格的功能:输入一行表格后,点击一个按钮,在表格最下面增加一行以便用户继续输入一行数据。    属性从略    可增长表格                                                                Javascript代码如下

2012-03-19 19:39:15 2218

原创 Javascript : 变量存放的是引用还是值

Javascript中,如果将一个基本数据类型的值赋给一个变量,变量中存放的是值;如果将一个对象赋给一个变量,变量中存放的是该对象的引用。        注意:Javascript中字符串类型是基本数据类型。        与基本数据类型字符串、数值、布尔类型相对应的是String对象、Number对象、Boolean对象。        将一个变量赋值为字符串后,可以对该变量使用St

2012-03-17 20:22:10 2573 1

原创 Google File System学习笔记

先贴上GFS Architecture示意图:        Google云架构是基于Google公司的实际应用需求而设计的,主要针对大型分布式数据密集型应用。因为这个设计太给力了,所以Apache基金会实现了一个开源版本,就是Hadoop,目前貌似Hadoop性能只有Google商业版的1/10。        如上图,数量众多的数据密集型应用通过GFS client接口,使用f

2012-03-15 20:11:51 1292

原创 Unix文件系统

Unix文件系统有多种实现,下文主要讨论基于BSD的UFS(UNIX File System)。        一般硬盘被分为多个分区,每个分区可以包含一个文件系统。文件系统的结构一般如下:自举块 | 超级块 | 柱面组0 | 柱面组1 | …… | 柱面组n其中,柱面组i的结构如下:超级块副本 | 配置信息 | i-node图 | 块位

2012-03-11 16:49:14 2166 1

原创 内存对齐

执行内存分配的操作是在操作系统内核中,但一般认为内存对齐是编译器的事。因为操作系统和编译器都有默认的对齐系数,但是可以通过编译器来进行修改。比如cl.exe可以通过#pragma pack(n)    // n = 1, 2 , 4, 8, 16来指定对齐系数。        需要内存对齐的原因,主要是从性能方面考虑,数据结构(尤其是栈)需要在自然边界上对齐

2012-03-09 16:25:12 592

原创 Linux系统启动流程

我们从按下电脑电源键开始说起。        (1) 首先是主板BIOS通电自检。按照《微机原理》课本上的说法,CS寄存器被置为0xFFFF,其它寄存器清零,因此CPU从FFFF:0000H处开始执行,这里保存的是跳转指令,跳转到固化在ROM中的自检程序处。于是对系统硬件包括内存进行自检。        当BIOS检查到硬件正常并且与CMOS的设置相符后,按照CMOS 中对启动设备的设置顺

2012-03-03 13:38:21 886

原创 用Raw socket自己构造数据包头部

一、原始套接字的创建        只有超级用户才能创建原始套接字。int sockFd;sockFd = socket(AF_INET, SOCK_RAW, protocol);        其中第3个参数protocol是形如IPPROTO_xxx的某个常值,在头文件中定义,经常不为0。        原始套接字不存在端口号的概念。

2012-02-29 21:01:30 10731 1

原创 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 759

原创 C++ : static关键字

自C语言以来,static就是个容易让人迷惑的关键字,因为根据使用场合的不同,它表示两种差别甚远的意义。        《C和指针》一书给出精要的解释:用于函数定义,或者用于代码块之外的变量声明        表示修改标识符的链接属性,从external改为internal。但标识符的存储类型和作用域不受影响。用这种方式声明的函数或变量只能在声明它们的源文件中访问。当sta

2012-02-29 15:51:55 522

原创 vim使用笔记

一、vim还是emacs        vim还是emacs? java还是C++? qt还是gtk? 争论是毫无意义的,谁好谁坏,孰对孰错,本没有绝对的标准。适合你的就是最好的。学习要快乐,不要纠结。        有一段时间听说emacs下有个写wiki的mode很方便,我也试着用了下emacs,但最终还是选择了vim。主要是两方面的原因:一、我先遇到vim。“正因为你为你的玫瑰花费了

2012-02-22 15:36:53 800

原创 struct关键字在C和C++中使用时的一点区别

很多同学在初学socket编程的时候,编译书上的第一个例子程序都会遇到这样一个问题,明明头文件都包含了,为什么编译总是报错:'sockaddr_in' undeclared'sockaddr' undeclared.        原因如下:        如果用gcc client.c -o client -Wall编译,则        struct sockadd

2012-02-02 12:44:18 1512

原创 VS2005设置Debugging information

用了快3年的XP崩溃了。现在连Vista都被微软抛弃了,而且Win7也确实慢慢成为主流的Windows系统,于是我也安装了个Win7。        在Win7下重装VS2005,提示有兼容性问题。上网查了下,问题不大,一般使用没有影响,要解决需要安装VS2005升级到Vista版的补丁。无视之,出了问题再说。打上VS2005SP1补丁。        编程,调试,出问题了,总是弹出对话框

2011-12-11 20:04:06 3079 1

空空如也

空空如也

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

TA关注的人

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