摘要: 程序: long fun_c(unsigned long long x) { int val = 0; for(int i=0;i<8;i++) //并行的计算x中8个单字节的和 { val += x^0x0101010101010101L; x >>=1; } val += (val>>32); //对val的两半求和 val += (val>>16); //对val的两个低16位求和 val += (val>>8); //对val的两个低字节求和 return ... 阅读全文
posted @ 2012-12-27 17:02 毛毛hhmm 阅读(193) 评论(0) 推荐(0) 编辑
摘要: 1. 大多数计算机使用字节作为最小的可寻址的存储器单位。机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器。存储器的每个字节都有一个唯一的数字来标识,称为它的地址,所有可能的地址的集合称为虚拟地址空间,其实际的实现是将随机访问存储器(RAM)、磁盘存储器、特殊硬件和操作系统软件结合起来,为程序提供一个看上去统一的字节数组。2. 小端:最低有效字节在最前面的方式; 大端:最高有效字节在最前面的方式。 举例:假设地址0x100处,存储着0x01234567,地址0x1000x1010x1020x103小端67452301大端012345673. 位向量表示有限集合:用位向量[aw-... 阅读全文
posted @ 2012-11-14 22:52 毛毛hhmm 阅读(539) 评论(0) 推荐(0) 编辑
摘要: (1).总线:贯穿整个系统的一组电子管道,它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,就是字(word)。字中的字节数(即字长)是一个基本的系统参数,现在大多数机器字长是4个或8个字节。(2).I/O设备:每个I/O设备(如鼠标、键盘、显示器、磁盘等)都通过一个控制器或适配器与I/O总线相连。控制器和适配器之间的区别在于它们的封装方式,控制器是置于I/O设备本身的或者系统的主印制电路板(即主板)上的芯片组,而适配器是一块插在主板插槽上的卡。两者作用都是在I/O总线和I/O设备之间传递信息。(3).主存:是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的 阅读全文
posted @ 2012-10-28 22:04 毛毛hhmm 阅读(304) 评论(0) 推荐(0) 编辑
摘要: (1).预处理(cpp):预处理器不止一种,而C/C++的预处理器就是其中最低端的一种——词法预处理器,主要是进行文本替换、宏展开、删除注释这类简单工作。gcc -E 选项可以得到预处理后的结果,扩展名为.i;C/C++预处理不做任何语法检查,不仅是因为它不具备语法检查功能,也因为预处理命令不属于C/C++语句(这也是定义宏时不要加分号的原因),语法检查是编译器要做的事情;预处理之后,得到的仅仅是真正的源代码;GCC确实很强大,如果是用VC这种IDE,恐怕就不能看到预处理后的结果。(2).编译器(ccl):将文本文件.i翻译成文本文件.s,得到汇编语言程序(把高级语言翻译为机器语言),该种语言 阅读全文
posted @ 2012-10-28 20:24 毛毛hhmm 阅读(3879) 评论(0) 推荐(0) 编辑
摘要: 思路:假设初始序列含有n个记录,可以看成n个有序的子序列,每个子序列的而长度为l,然后把每i(i>=2)个子序列归并,得到n/i个长度为i的有序子序列,再继续归并,如此重复直到得到一个长度为n的有序序列为止。这种排序方法称为i路归并排序。在内部排序中,通常是采用2路归并排序。程序代码: void Merge(Elem temp[],Elem R[],int low,int mid,int high) //将temp中的两个有序子序列归并到R中 { for(i = low,j = mid+1,k = low;i <= mid && j <= high;k++) 阅读全文
posted @ 2012-09-13 21:41 毛毛hhmm 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 程序代码: void HeapAdjust(Elem R[],int s,int m) { rc = R[s]; for(i = 2*s;i <= m; i++) //查找rc应插入的位置 { if((i < m && R[i]<R[i+1]) i++; //i为左右子树较大记录的下标 if(rc > R[i]) break; R[s] = R[i]; s = i; } R[s] = rc; } void HeapSort(Elem R[],int ... 阅读全文
posted @ 2012-09-13 20:59 毛毛hhmm 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 程序代码: void SelectSort(Elem R[],int n) { for(i = 1;i < n;i++) { //选择第i小的记录,并交换到位 min = R[i]; for(j = i;j <= n;j++) if(R[j] < min) min = R[j]; if(i != j) swap(s[i],s[j]); } }时间复杂度:比较次数(n-1)+(n-2)+---+1 = n(n-1)/2; 移动次数最小值为0,最大值为3(n-1)。稳定性:不稳定... 阅读全文
posted @ 2012-09-13 18:53 毛毛hhmm 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 思想:通过一趟排序将待排文件分割成独立的两部分,其中一部分记录的排序码均比另一部分记录的排序码小,然后分别对这两部分进行排序,以达到整个文件有序。一趟快速排序的做法是:设两个变量low和high,它们的初值分别是待排序文件的第一个和最后一个记录的位置,并且取一个记录作为枢轴使用,开始从high所指位置向前搜索直到第一个排序码小于枢轴的记录和枢轴的记录交换,然后从low所指位置向后搜索,找到第一个排序码大于枢轴的记录再和枢轴的记录互相交换,重复交替这两步直到low=high为止。程序代码: int Partition(Elem R[],int low,int high) { pivot... 阅读全文
posted @ 2012-09-12 21:46 毛毛hhmm 阅读(603) 评论(0) 推荐(0) 编辑
摘要: 程序代码: void BubbleSort(Elem R[],int n) { i = n; while(i > 1) { last_exchange = 1; for(j = 1;j < i;j++) if(R[j] > R[j+1]) { swap(R[j],R[j+1]); last_exchange = j; } i = last_exchange; } }最好情况:记录有序,比较次数n-1,移动次数为0;最差情况:记录逆序,比较次数(n-1)+(n... 阅读全文
posted @ 2012-09-12 21:22 毛毛hhmm 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 思想:先对待排序记录进行宏观调整,再进行微观调整。宏观指:将记录序列分成若干个子序列,分布对每个序列进行插入排序。程序代码: void ShellInsert(Elem R[],int dk) { for(i = dk+1; i < R.length; i++) if(R[i-dk] > R[i]) { R[0] = R[i]; for(j = i - dk;(j > 0) && (R[0] < R[j]); j -= dk) R[j+dk] = R[j]; R[j+dk] = R[0]; } ... 阅读全文
posted @ 2012-09-12 21:02 毛毛hhmm 阅读(159) 评论(0) 推荐(0) 编辑