摘要:
根据上排给出十个数,在其下排填出对应的十个数要求下排每个数都是先前上排那十个数在下排出现的次数。上排的十个数如下:【0,1,2,3,4,5,6,7,8,9】举一个例子,数值: 0,1,2,3,4,5,6,7,8,9分配: 6,2,1,0,0,0,1,0,0,00 在下排出现了 6 次,1 在下排出现... 阅读全文
摘要:
读《深入理解计算机系统》 第二章 信息的表示与处理检查2个无符号数相加是否溢出1 bool checkUAddOverflow(unsigned int x,unsigned int y)2 {3 return x+y 0; 5 bool pos = x>=0 && y>= 0 && sum 0 && sum > 0; 5 bool pos = x>=0 && y0) && (x-y > 0 == x<0); //x==0要和y<0在一组13 }检查2个整数相乘是否溢出 1 阅读全文
摘要:
读《深入理解计算机系统》第二章 信息的表示与处理无符号数的编码就是简单的二进制编码,有符号数采用补码。补码:0001 = -23*0 + 22*0 + 21*0 + 20*1 = 11111 = -23*1 + 22*1 + 21*1 + 20*1 = -1最高有效位(符号位)的权重是-2w-1,其中w是二进制长度补码的非:数字x的补码的非就是其加法逆元,即-x;其二进制表示为取反后再加1,即~x+1;计算机用加上逆元的方式来执行减法运算,底层并没有减法。有符号与无符号数的运算:有符号与无符号是编程语言层面的事情,是对二进制串的人为解读。底层CPU把一切都当作补码,用统一的规则进行运算,符号类 阅读全文
摘要:
问题:输入一个序列(元素无重复),输出其全排列一般采用经典的递归解法,后来想将其改造为非递归代码,思考很久后觉得并不好写,手工模拟递归栈的行为容易出错。然后上网搜索了一下众网友的非递归代码,发现很多人的非递归代码是各种全新的求解算法,而不是相同算法的非递归实现,和我想要的不一样。递归解法:假设输入序列[0,1,2,3],将其分解为4个子问题0+[1,2,3],1+[0,2,3],2+[0,1,3],3+[0,1,2],这样每个子问题的规模减小了1,一直递归下去直到无法再分解。 1 //对a[idx]~a[n-1]的元素进行全排列,原地排列 2 //第一个参数为序列集合,第二个为序列长度,第三个 阅读全文
摘要:
读《深入理解计算机系统》第二章 信息的表示与处理利用异或实现变量交换(习题2.10),使用以下函数时需注意的地方是不要让2个入参指向同一个地址,会返回0(习题2.11);1 void swap(int *x,int *y)2 {3 *y = *x^*y;4 *x = *x^*y;5 *y = *x^*y;6 } 阅读全文
摘要:
读《深入理解计算机系统》第二章 信息的表示与处理字节序:大多数intel兼容机采用小端字节序:低字节存放在存储器的低地址,注意是以字节为单位。12345(十进制)低地址--------->高地址0x0000303939 30 00 00 00 网络协议采用大端字节序:高字节存放在存储器的低地址。移位:据说c语言并没有明确定义有符号数何时用算术移位,何时用逻辑移位。但无符号数必须是逻辑移位。引用这位朋友的评论,这个描述比较精确2013-06-21 09:13 | 五岳 “据说”可不好 如果是模棱两可的东西 可以去标准里确认一下这部分内容C99和C11是一样的4. The result of 阅读全文
摘要:
读《深入理解计算机系统》第二章 信息的表示与处理32位与64位的典型值,单位字节声明32位机器 64位机器char11short int22int44long int48(4?)long long int88char*48float44double88不过long int在VC中32与64位编译器均是4字节,貌似表格中数据也不算很典型啊,所以在vc下除了指针大小不同外,其他都没区别。此外C99新增的long double在标准中只约束了其最小表示范围,比如FLT_MAX、DBL_MAX、LDBL_MAX规定的最低要求均为10^37,所以大多数编译器的double可以精确表示long doub. 阅读全文
摘要:
读《深入理解计算机系统》第二章 信息的表示与处理10进制转换16进制十进制x转换16进制,可以反复用16除x,x=q*16+r,得到的余数r作为16进制的低位,商q作为新的x,反复迭代直到商为0.314156 = 19634*16+12 (C)19634 = 1227*16+2(2)1227 = 76*16+11 (B)76 = 4*16+12 (C)4 = 0*16 +4 (4)结果为0x4CB2C 阅读全文
摘要:
读《深入理解计算机系统》第一章并发concurrent:有多个活动在时间上重叠,称为并发,并不一定要求活动同时执行,可以是交替执行的。并行parallelism:多个活动同时执行。并行的3个层次:1、线程级并行单处理器系统线程只能通过交替执行模拟并行,并发。此外还有超线程,是允许一个cpu执行多个控制流的技术。cpu的某些硬件有多份,比如程序计数器和寄存器,而其他硬件只有1份,比如浮点运算单元。这种处理器切换线程速度很快,在一个线程等待数据加载到高速缓存的时候,可以执行另外一个线程。比如i7处理器可以让一个核执行2个线程,尽量提高核的效率。多处理器则可以利用硬件进行线程级并行。2、指令级并行c 阅读全文
摘要:
读《深入理解计算机系统》第一章进程是操作系统对一个正在运行的程序的抽象,一个系统可以同时运行多个进程,而每个进程都好像在独占地使用硬件。是计算机最重要和成功的概念之一。一个进程由一个或多个称为线程的执行单元组成,运行在进程的上下文中(操作系统跟踪进程所需的所有状态信息,比如寄存器及主存的内容),线程共享同样的代码和全局数据,有独立的堆栈和程序计数器。 阅读全文