· 二进制补码基础
补码用于在计算机内表示负数, 负数 2的补码表示法可以将加法运算规则, 扩展到整个整数集。
· 机器数:带符号的二进制码字 ,比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是0000 0011。如果是 -3 ,就是 1111 1101 。那么,这里的 00000011 和 1111 1101 就是机器数。 机器数包含了符号和数值部分。
·真值:带符号位的机器数对应的真正数值,比如 -3,+3
·在计算机内,有符号数有3种表示法:原码、反码和补码。
[+1] = [ 00000001 ]原码 = [ 00000001 ]反码 = [ 00000001 ]补码 ;
[-1] = [ 10000001 ]原码 = [ 11111110 ]反码 = [11111111]补码
原码第一位是符号位, 所以若是8位二进制数,其取值范围就是: [1111 1111 , 0111 1111] 即[-127 , 127]
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码:正数原码一致,负数反码加1,如-8= 0-8 ((11111111-00001000)反码 +00000001)加1 =11111000
C语言中变量以补码形式存放在内存中,正数的补码与原码相同,负数求补码方式为(符号位不变,其余各位取反,最后末尾加1);
32位机器:int 32位,short 16位。
x = 127,正数,原码:0111 1111,补码:0111 1111,扩展到32位高位补0,结果为0000007FH;
Y = -9, 负数,原码:1000 1001,补码:1111 0111,扩展到16位高位补1,结果为FFF7H;
z = x + y = 118,原码:0111 0110,补码:0111 0110,扩展到32位高位补0,结果为00000076H。 注意:扩展时,符号位不变。
· 哈夫曼编码
在处理字符串序列时,如果对每个字符串采用相同的二进制位表示,则称这种编码方式为定长编码。若允许对不同的字符采用不等长的二进制位进行表示,那么这种方式称为可变长编码。可变长编码其特点是对使用频率高的字符采用短编码,而对使用频率低的字符则采用长编码的方式。这样我们就可减少数据的存储空间,从而起到压缩数据的效果。而通过哈夫曼树形成的哈夫曼编码是一种有效的数据压缩编码。
· KMP算法及next数组求解
对于正常的字符串模式匹配,主串长度为m,子串为n,时间复杂度会到达O(m*n),空间复杂度为O(1),而如果用KMP算法,复杂度将会减少线型时间O(m+n),由于涉及到next数组的存储,空间复杂度O(n)。
· next数组求解:以从1开始,next[1]=0,next[2]=1,next[n] :将前面n-1个字符,计算从首尾开始组成最大的相同子串的长度,如果找到,那么next值是该长度加1,否则next值是1。
· kmp及next数组实现:代码
· 错题总结:
1、strlen:字符串长度,不包含‘结束符\0’ 转义字符:\\=\ ; \123=S; \t=Tab键; \0表示后面字符为八进制,‘\09’为非法字符。
2、 广义表L=(A,B,C),表头是A,表尾是(B,C) 。tail()表示取字符串的尾部,head()表示取字符串的头。
3、 printf("格式控制字符串", 输出列表);printf("%s", string); putchar(字符数据)char a_c=‘h’;putchar(a_c);puts(字符串); puts(“hello girl”) ;
4、 结构体内存原则: 对齐原则:每一成员需对齐为后一成员类型的倍数// 补齐原则:最终大小补齐为成员类型最大值的倍数
5、 %s格式输出直到'\0'的字符串,字符串尾数字0为‘\0’结束符,%c对应的是单个字符,%d是十进制整数型输出。
6、65536 相当于 unsigned short 的0值。如 65537:1 00000000 00000001,(2字节)short i = 65537时,发生了溢出取16bit,为1。
7、单线程运行效率: String<< StringBuffer( 线程安全 )< StringBuilder( 非线程安全 )