自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(75)
  • 资源 (4)
  • 收藏
  • 关注

原创 随笔二十四:逆向工程

通过研究系统和逆向工作,来试图了解系统的创建过程。

2012-06-30 15:04:22 669

原创 随笔二十三:为什么要学习机器代码?

1、通过阅读汇编代码,理解编译器的优化能力,分析代码中隐含的低效率。2、了解有关程序运行时行为的信息。(高级语言的抽象层隐藏了这些)       eg:1)当用线程包写并发程序时,知道存储器存储不同的程序变量的区域是很重要的。这些信息在汇编代码级是可见的。                2)程序遭受攻击的许多方式中,都涉及程序存储运行时控制信息方式的细节。许多攻击利用了系统程序中的漏洞

2012-06-30 15:00:06 833

原创 编写函数,当正溢出时,返回TMax,负溢出时,返回TMin。

int saturating_add(int x, int y){ int nbit = sizeof(int) << 3; int result = x + y; /* `of' means overflow.It will be 111...11111 if overflowed,0000...000 otherwise */ int of = ( ( x ^

2012-06-30 11:55:35 4566 3

原创 Return 1 when x can be represented as an n-bit, 2's complment number; 0 otherwise

int fits_bits(int x, int n){ int count = sizeof(int) << 3 - n; return ((x > count) == x;}

2012-06-30 10:23:30 2691 1

原创 编写函数实现“循环”右移

方法1:unsigned rotate_right(unsigned x, int n){ int mask = ~(0 - (1 << n - 1) - (1 << n -1)); mask &= x; int w = sizeof(unsigned) << 3; mask <<= w - n; x >>= n; return x | m

2012-06-30 09:56:35 1160

原创 编写函数实现:clear all but least signficant n bits of x

方法1:int lowe_bits(int x, int n){ int w = sizeof(int) << 3; unsigned y = ~0; y >>= (w - n); return y & x; }方法2:int lower_bits(int x, int n){ int mask = ~(0 - (1 << n - 1

2012-06-30 08:48:35 955

原创 编写函数,找到位向量最左边的1,将其后所有位置0

代码如下:int leftmost_one(unsigned x) { x |= (x >> 1); x |= (x >> 2); x |= (x >> 4); x |= (x >> 8); x |= (x >> 16); return (x & ((~x >> 1) | 0x80000000)); }

2012-06-29 15:23:47 959

转载 判断一无符号整数的二进制形式中是否包含偶数个1

题目要求:若二进制无符号整数x包含偶数个1,返回1,否则返回0.要求:只能使用位运算、加减法和==、!=,最多包含12个算术运算、位运算和逻辑运算,可以假设sizeof(unsigned)==4不能使用乘除模运算,不能使用条件分支,循环,函数调用,大小比较等(详见《深入理解计算机系统》第二章习题)代码如下:[cpp] view plaincopy

2012-06-28 16:27:40 1277

原创 编写函数srl用算术右移来完成逻辑右移;函数 sra 用逻辑右移来完成算术右移。

int sra(int x, int k){ int xsrl = (unsigned) x >> k; int w = sizeof(int) << 3; return xsrl |= (-1 << (w-k));} unsigned srl(unsigned x, int k){ unsigned xsra = (int) x >> k;

2012-06-28 15:45:46 4321 9

原创 从整数参数 x 中抽取出最高有效字节

int get_msb(int x){ int shift_val = (sizeof(int) - 1) << 3; int xright = x >> shift_val; return xright && 0xff;}

2012-06-28 14:48:15 1515

原创 编写一个函数int_shifts_are_logical(),在对 int 类型的数使用算术右移的机器上运行时,这个函数生成1,而其他情况下生成0

方法1:int int_shifts_are_logical(void){ int i = -1; i >>= 4; char *p = (char *)&i; return -(*p);}方法2:int int_shifts_are_arithmetic(){ int shift_val = (sizeof(int)-1)<<3; int

2012-06-28 14:45:54 2099

原创 写出下面 C 函数的代码,它会返回一个无符号值,其中参数 x 的字节 i 被替换成字节 b

方法1、unsigned put_byte(unsigned x, unsigned char b, int i){ assert(i >= 0 && i < sizeof(unsinged)); return ~(0xFF << 8 * i) & x | (b << 8 * i);}方法2、unsigned put_byte(unsigned x,

2012-06-28 14:10:41 2482

转载 大小端机器的判断-引发的思考

深入理解计算机系统中第二章节有一习题:编写过程is_little_endian,当在小端机器上编译和运行时返回1,在大端法机器上编译运行时则返回0。这个程序应该可以运行在任何机器上,无论机器的字长是多少?其参考答案如下:There are many ways to solve this problem. The basic idea is to create some multib

2012-06-28 08:42:48 1584

原创 随笔二十二:C 语言中的浮点数

C 语言标准不要求使用 IEEE 浮点,所以没有标准的方法来改变舍入方式或者得到诸如-0、+无穷、-无穷或者 NaN 之类的特殊值。大多数系统提供include('.h')文件和读取这些特征的过程库,但是细节因为西哦同的不同而不同。例如,当程序文件中出现下列句子时,GNU 编译器 GCC 会定义程序常数 INFINITY (表示+无穷)和NaN (表示 NaN)。#define _GNU_SO

2012-06-28 07:11:10 997

原创 随笔二十一:浮点运算

实数上的加法也形成了阿尔贝群,但是必须考虑舍入对这些属性的影响。加法运算是可交换的,另一方面,这个运算是不可结合的。浮点加法布局结合性,这是缺少的最重要的群属性。另一方面,浮点加法满足了单调性属性:如果 a >= b,那么对于任何 a、b 以及 x 的值,除了 NaN,都有 x + a >= x + b。无符号或补码加法不具备这个实数(和整数)加法的属性。        浮点乘法也遵循通常乘法

2012-06-28 06:47:26 1434

转载 Qt开发串口通信以及坐标显示程序并移植

毕业了,整理下思绪,把我之前在实验室弄的一个Qt终端界面开发的程序的整体思路以及源代码共享开来,以便于更好地让Qt为人所知,为开源贡献点我的微薄之力。一. 项目介绍  项目背景的简要介绍:通过串口从数据采集板传输数据到终端板上面,自行设计一个界面用来显示收集到的数据,以及画出所对应的坐标点。终端显示界面的板子是基于S3C6410芯片的,板子是师兄根据Mini6410开发板电路图画出来的,做

2012-06-27 19:39:32 6381 1

转载 IT的老兵:我们缺什么

最近是自己的公司关张的日子,在挣扎了三年之后,明白了很多,但结局还是残酷的现实写照。看了下面的文章,心里有些感慨,格拉汉姆表示,他希望企业家不仅有才华,还能具备其他特征。“有很多聪明人都一事无成。”他说。  他希望企业创始人能有坚定的决心。“有些人一心想得到自己想要的东西,”格拉汉姆说,“他们不会消极,不会失去方向。”我缺了什么,决心,还是方向,还是在IT生态变化之后的新的机会

2012-06-27 18:44:41 3090

转载 再也不能这样活 再也不能那样过

引言     “再也不能这样活 再也不能那样过 生活就得前思后想 想好了你再做”略知一二起,从业三四年,项目五六个,加班七八点,读书九十本,方向已茫然。这就是我这几年IT生涯的真实写照,我想,也应该是部分同行的状态。突然听到刘欢大哥的“再也不能这样活 再也不能那样过 生活就得前思后想 想好了你再做”,心里突然有很大的触动。程序员的出路,到底是什么?下面是我最近的思考结果。1.1

2012-06-27 17:44:09 2316

转载 俞敏洪老师的这段话......

“有人说:女生到社会上会遇到比学校更优秀的男生,而男生很难找到比在学校更好的女生,我现在告诉你,这句话你们都理解错了。这句话的意思是:男生在校园都还不成熟,19到25岁的男孩一般都比同龄女孩显得放不开,但到社会上,很快男人变的就优秀的多了,这说明大学几年是男生成熟的重要时期。而女生到社会变的实际了,于是就有了你们经常听到的那一句话!而我一直认为,清华大学比北京大学的男生优秀就在于清华大学的男生能学

2012-06-27 17:42:24 610

原创 随笔二十:浮点数

考虑二进制小数表示的一个简单方法是将一个数表示为形如x/(2^k)的小数。将这个形式表示为二进制的过程是:使用 x 的二进制表示,并把二进制小数点插入从右边算起的第 k 个位置。        IEEE 浮点表示        在单精度浮点格式(C语言中的float)中,s、exp 和 frac 字段分别为 1 位、 k = 8 位和 n = 23 位,得到一个 32 位的表示。在双精度浮

2012-06-25 09:29:18 1497

原创 随笔十九:除以 2 的幂

在大多数机器上,整数除法要比整数乘法更慢——需要30个或者更多的时钟周期。除以 2 的幂也可以用移位运算来实现,只不过用的是右移,而不是左移。无符号和补码数分别使用逻辑移位和算术移位来达到目的。        整数除法总是舍入到零。对于使用算术右移的补码机器, C 表达式        (x > k        除以 2 的幂可以通过逻辑右移和算术右移来实现。这也是为什么大多数机器上

2012-06-25 08:47:21 1060

原创 检测两个整数相乘是否会产生溢出

1、对于 int 型:int tmult_ok(int x, int y){ int p = x * y; return !x || p / x == y;}2、如果使用64位表示,乘法则不会溢出。int tmult_ok(int x, int y){ long long pll = (long long) x * y; return pll =

2012-06-24 15:11:42 4172

原创 随笔十八:整数乘法

对于无符号和补码乘法来说,乘法运算的位级表示都是一样的。这表明机器可以用一种乘法指令来进行有符号和无符号整数的乘法。        在大多数机器上,整数乘法指令相当慢,需要 10 个或者更多的时钟周期,然而其他整数运算(例如加法、减法、位级运算和移位)只需要 1 个时钟周期。因此,编译器使用了一项重要的优化,试着用移位和加法和减法运算的组合来代替乘以常数因子的乘法。        对于一个

2012-06-24 14:20:59 1592

转载 振作只需一个理由:日子不能这样过

近日作了《“差生”,不要再拿兴趣说事》一文,引起网友的热议。  趴倒不干的理由千千万:没有兴趣,不了解,学不懂,老师不好,氛围不浓,没有地方,网络、手机坏事,他们老叫我……。世界之大,竟没有安放此君一颗进步之心的地方。  静夜思的时候也常纠结:父母,学费 ,大学前的寒窗十二载,曾经的理想,中学老师的厚爱,家族的荣耀,弟妹的榜样,大学老师的关心(如果有),表面荣光内心的空虚,没有人当面说却能

2012-06-24 14:12:09 634

转载 “差生”,不要再拿兴趣说事

【姊妹篇】振作只需一个理由:日子不能这样过  这几日让同学们总结一年的学习,欣赏了不少美文。同学们的普遍进步让我兴奋,也发现了我在教学过程中没有关注到的一些方面。同学们对老贺在学习中起到的作用大加褒扬,着实让虚荣的老贺飘飘然了。  但是,我更关注另一个群体。为专业基础好的同学“锦上添花”,为成绩较弱难以跟上学习进度的学生“雪中送炭”,促进处于迷茫期的学生发生“染丝之变”(见媒体报道),是我

2012-06-24 14:06:00 1565

原创 补码非的位级表示

计算一个位级表示的值的补码非有几种聪明的办法。这些技术很有用,同时它们也能够使我们更了解补码表示的本质。        行位级补码非得第一种计算方法是对每一位求补,在对结果加1。在 C 语言中,可以确定,对于任意整数值 x, 计算表达式 -x 和 ~x+1 得到的结果完全一样。        计算一个数 x 的补码非的第二种方法是建立在将位向量分为两部分的基础之上的。假设 k 是最右边的

2012-06-24 09:37:38 1450

原创 检查整数运算是否溢出

1、对于无符号加法:int uadd_ok(unsigned x, unsigned y){ unsigned sum = x + y; return sum >= x;}2、对于补码加法:int tadd_ok(int x, int y){ int sum = x + y; int neg_over = x = 0; int pos_ov

2012-06-24 08:23:40 709

原创 随笔十七:扩展一个数字的位表示

讲一个无符号数转换为一个更大的数据类型,只需简单地在表示的开头添加0,这种运算称为零扩展(zero extension)。将一个补码数字转换为一个更大的数据类型可以执行符号扩展(sign extension),规则是在表示中添加最高有效位的值的副本。         从一个数据大小到另一个数据大小的转换,以及无符号和有符号数字之间的转换的相对顺序能够影响一个程序的行为。(转换的规则:先改变大小

2012-06-23 16:48:41 687

原创 随笔十六:同样字长的无符号与有符号数之间互相转换的一般规则

对大多数 C 语言的实现而言,处理同样字长的有符号数和无符号数之间相互转换的一般规则是:数值可能会改变,但是位模式不变。                由于 C 语言对同时包含有符号和无符号数表达式的这种处理方式,出现了一些奇特的行为。当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么 C 语言会隐式地将有符号参数强制转换为无符号数,并假设这两个数都是非负的

2012-06-23 15:04:23 1467

转载 双射

双射目录简介定义双射的应用举例展开编辑本段简介  既是单射又是满射的映射称为双射,亦称“一一映射”  设f是从集合A到集合B的映射,若R(f)=B,即B中任一元素b都是A中某元素的像,则称f为A到B上的满射;若对A中任意两个不同元素a(1)不等于a(2),他们的像f不等于f,则称

2012-06-23 14:55:28 9928

原创 将数组中的元素头尾两端依次对调

void inplace_swap(int *x, int *y){ *y ^= *x; *x ^= *y; *y ^= *x;}void reverse_array(int a[], int cnt){ int first, last; for (first = 0, last = cnt - 1; first < last; ++first,

2012-06-22 15:07:43 2077

原创 交换两个数的方法总结

方法一:使用宏#define Exchage(a, b) \do{ \ a += b;\ b = a - b; \ a = a - b \}while(0)方法二:使用第三个变量void inplace_swap(int *a, int *b){ int tmp; tmp =

2012-06-22 14:52:38 714

原创 随笔十五:字节顺序引起的问题

首先是在不同类型的机器之间通过网络传送二进制数据时,一个常见的问题是当小端法机器产生的数据被发送到大端法机器或者反方向发送时会发现,接受程序字里是的字节成了反序的。为了避免这类问题,网络应用程序的代码编写必须遵守已建立的关于字节序列的规则,以确保发送方机器将它的内部表示转换成网络标准,而接收方机器则将网络标准转换为它的内部表示。        第二种情况是,当阅读表示整数数据的字节序列时字节顺

2012-06-22 11:21:09 678

原创 十六进制转换为十进制

#!/usr/bin/perl# Convert list of hex numbers into deciamlfor ($i = 0; $i < @ARGV; $i++){ $val = hex($ARGV[$i]); printf("0x%x = %d\n", $val, $val);}

2012-06-22 09:34:36 766

原创 十进制和十六进制的转换

#!/usr/bin/perl# Convert list of decimal numbers into hexfor ($i = 0; $i < ARGV; $i++){ printf("%d\t= 0x%x\n", $ARGV[$i], $ARGV[$i]);}

2012-06-22 09:31:56 643

原创 随笔十四:十进制与十六进制转换

十进制和十六进制表示之间的转换需要使用乘法或者除法来处理一般情况。将一个十进制数字 x 转换为十六进制,可以反复地用 16 除 x,得到一个商 q 和一个余数 r,也就是 x = q * 16 + r。然后,我们用十六进制数字表示的 r 作为最低位数字,并且通过对 q 反复进行这个过程得到剩下的数字。

2012-06-22 09:28:55 707

原创 随笔十三:二进制与十六进制转换

当值 x 是 2 的非负整数 n 次幂时,也就是 x = 2^n,可以很容易地将 x 写成十六进制形式,只要记住 x 的二进制表示就是 1 后面跟 n 个 0。十六进制数字 0 代表 4 个二进制 0。所以,当 n 表示成 i + 4j 的形式,其中 0 <= i <= 3时,可以把 x 写成开头的十六进制数字为 1(i = 0)、2(i = 1)、4(i = 2)、8(i = 3),后面跟随

2012-06-21 18:20:16 896

原创 随笔十二:整型与浮点数(1)

整数的计算机运算情况满足人们所熟知的真正整数运算的定律。相乘溢出得到的结果可能为负。        浮点运算有完全不同的数学属性。虽然溢出会产生特殊的值+无穷,但是一组正数的乘积总是正的。由于表示精度的有限,浮点运算是不可结合的。

2012-06-21 17:25:56 690

原创 随笔十一:并发与并行

并发(concurrency)是一个通用的概念,指一个同时具有多个活动的系统;而术语并行(parallelism)指的是用并发使一个系统运行更快。并行可以在多个抽象层次上运行用。按照系统层次结构中由高到低的顺序重点强调三个层次。        1、线程级并发;        2、指令级并发;        3、单指令、多数据并行;

2012-06-19 18:52:59 1169

原创 随笔十:虚拟存储器

虚拟存储器的运作需要硬件和操作系统软件之间精密复杂的交互,包括对处理器生成的每个地址的硬件翻译。其基本思想是把一个进程虚拟器的内容存储在硬盘上,然后用主存作为磁盘的高速缓存。

2012-06-19 17:17:12 549

Nitro PDF 7* 序列号

nitro pdf professional 6 & 7 任意版本都可以。仅供学习研究,请支持正版。

2012-09-07

黑客与画家 epub

本书是硅谷创业之父Paul Graham 的文集,主要介绍黑客即优秀程序员的爱好和动机,讨论黑客成长、黑客对世界的贡献以及编程语言和黑客工作方法等所有对计算机时代感兴趣的人的一些话题。书中的内容不但有助于了解计算机编程的本质、互联网行业的规则,还会帮助读者了解我们这个时代,迫使读者独立思考。 本书适合所有程序员和互联网创业者,也适合一切对计算机行业感兴趣的读者。

2012-06-15

kscope-1.6.2

kscope-1.6.2,linux下阅读代码的工具,编译安装过程可参考http://blog.csdn.net/hmsiwtv/article/details/7646673

2012-06-11

VMWare Workstation 8.0.2 and Linux Kernel 3.2 Kernel

可用于linux kernel 3.2和3.3,使用方法请见我的博客

2012-04-04

空空如也

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

TA关注的人

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