基础知识复习

时间:2023-08-26
本文章向大家介绍基础知识复习,主要内容包括原码、反码和补码、进制转换、通用方法、转换为十进制:、短除法、二、八、十六进制的特殊解法、非十进制小数转换、位运算、按位与、按位或和异或、使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

原码、反码和补码

  1. 原码
    原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。比如:如果是8位二进制:
    [+1]原= 0000 0001
    [-1]原= 1000 0001
    第一位是符号位(即第一位不表示值,只表示正负),因为第一位是符号位,所以8位二进制数的取值范围就是:[1111 1111 , 0111 1111]即[-127 , 127]
    原码是人脑最容易理解和计算的表示方式。

  2. 反码
    反码的表示方法是:
    正数的反码是其本身;负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
    [+1] = [0000 0001]原 = [0000 0001]反
    [-1] = [1000 0001]原 = [1111 1110]反
    可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值。通常要将其转换成原码再计算。

  3. 补码
    补码的表示方法是:
    正数的补码就是其本身;负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。(也即在反码的基础上+1)
    [+1] = [0000 0001]原 = [0000 0001]反 = [0000 0001]补
    [-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]补
    对于负数,补码表示方式也是人脑无法直观看出其数值的。通常也需要转换成原码再计算其数值。

进制转换

通用方法

先转换为十进制(已经是则不用转换),再通过短除法得出新数。

转换为十进制:

按权展开再相加。当我们由N进制数字\(\overline{a_na_{n-1}...a_2a_1}\)转为十进制时要进行这样的运算:\(a_nN^{i-1}+a_{n-1}N^{n-2}+...+a_2N^1+a_1N^0\)
用另一种方式表示就是:
\(x(N) = y(10)(x有n位)\)
\(y = \sum\limits_{i=1}^nx_iN^{i-1}\)

短除法

短除法运算方法是先用一个除数除以能被它除尽的一个质数,以此类推,除到商是质数为止。具体在我们的进制换算里,当一个M进制数转N进制数时,就是用这个数除N取余,逆序排列。具体做法是:将N作为除数,用M进制整数除以N,可以得到一个商和余数;保留余数,用商继续除以N,又得到一个新的商和余数;仍然保留余数,用商继续除以N,还会得到一个新的商和余数;如此反复进行,每次都保留余数,用商接着除以N,直到商为0时为止。然后从上到下取出余数就是从末尾到开头的新数(即最上面的余数是从左往右第一位,最下面的是从左往右最后一位)。

二、八、十六进制的特殊解法

如果是二进制转八进制,不难发现补齐二进制开头的零(如位数已是三的倍数则不用),二进制每三位即对应着八进制的一位。所以可以将八进制每一位拿出来,分别转换为二进制,最后按顺序拼接就是最后的答案。
其余十六进制转二进制、二进制转十六进制以此类推。

非十进制小数转换

首先明确对于N进制来说,第一位小数的权值为\(N^{-1}\),第i位小数的权值为\(N^{-i}\),即为\(\frac{1}{n^i}\)。明确这一点便可以通过与整数短除法类似的方法解决。

位运算

按位与、按位或和异或

按位与运算符(&)

运算规则:只有两个数的二进制同时为1,结果才为1,否则为0。(负数按补码形式参加按位与运算)
即 0 & 0= 0 ,0 & 1= 0,1 & 0= 0, 1 & 1= 1。
例:3 &5 即 00000011 & 00000101 = 00000001 ,所以 3 & 5的值为1。
(建议位运算时列竖式并对齐)

按位或运算符(|)

运算规则:参加运算的两个数只要两个数中的一个为1,结果就为1。
即 0 | 0= 0 , 1 | 0= 1 , 0 | 1= 1 , 1 | 1= 1 。
例:2 | 4 即 00000010 | 00000100 = 00000110 ,所以2 | 4的值为 6 。

异或运算符(^)

运算规则:参加运算的两个数,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
即 0 ^ 0=0 , 0 ^ 1= 1 , 1 ^ 0= 1 , 1 ^ 1= 0 。
例: 2 ^ 4 即 00000010 ^ 00000100 =00000110 ,所以 2 ^ 4 的值为6 。

左移右移

左移运算符(<<)

定义:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
设 a=1010 1110,a = a<< 2 将a的二进制位左移2位、右补0,即得a=1011 1000。
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。

右移运算符(>>)

定义:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
例如:a=a>>2 将a的二进制位右移2位,左补0 或者 左补1得看被移数是正还是负。
操作数每右移一位,相当于该数除以2(向下取整)。

位运算操作

lowbit(求二进制表达式中最低位的1所对应的值)

int lowbit(int x){
    return x&(-x);
}

求一个数字二进制位中1的个数

int count_1(int a) {
    int count = 0;
    while (a) {
        a = a & (a - 1);
        count++;
    }
    return count;
}

取第i位的数字

(a>>i)&1

交换两个数字

a ^= b;
b ^= a;
a ^= b;//交换a和b

求一个数二进制下的位数

int leng(int n){
	int len = 0;
	while(n){
		n>>=1;
		len++;
	}
	return len;
}

运算符优先级

传送门

编程语言

编译型语言和解释型语言

编译型语言

需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。
优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。
缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。
代表语言:C、C++、Pascal、Object-C以及最近很火的苹果新语言swift

解释型语言

解释性语言的程序不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。
优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。
缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。
代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby

面向对象与面向过程

面向过程

类调用需要实例化,开销大,比较消耗资源,所以当性能是最重要的因素是,比如单片机、嵌入式开发、Linux、Unix等一般采用面向过程开发。常见语言:C。

面向对象

面向对象易维护、易复用、易扩展。面向对象具有封装、继承、多态的特定,可以设计出低耦合的系统,但是比面向过程性能低。常见语言:C++、Java、Python、C#、Go、JavaScript、PHP等。

操作系统

类Unix操作系统

包括Linux、BSD、macOS、iOS、Android

其他操作系统

Windows:DOS系统、Windows 1.0、Windows 2.0、Windows 3.x、Windows 95、Windows 98、Windows XP、Windows 7、Windows 8、Windows Vista、Windows 8.1、Windows 10、Windows 11、indows 2000、 Windows longhorn

计算机内部

RAM和ROM(内存储器)

RAM是随机存取存储器,是与CPU直接交换数据的内部存储器,也叫主存(内存)。ROM是只读存储器,ROM所存数据,一般是装入整机前事先写好的,整机工作过程中只能读出。两者的区别是RAM在断电以后保存在上面的数据会自动消失,而ROM不会自动消失,可以长时间断电保存。

提醒

RAM与ROM其实都是内存
硬盘是外存
ROM不等于硬盘

寄存器

寄存器(register)是CPU(中央处理器)的组成部分,是一种直接整合到cpu中的有限的高速访问速度的存储器。cpu访问寄存器的速度是最快的。但是寄存器是一种容量有限的存储器,并且非常小。

缓存(Cache)

缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。

联系

按与CPU远近来分,离得最近的是寄存器,然后缓存,最后内存。所以,寄存器是最贴近CPU的,而且CPU只与寄存器中进行存取。寄存器从内存中读取数据,但由于寄存器和内存读取速度相差太大,所以有了缓存。

数据类型的位数

传送门

Linux系统

Linux指令

ls:列出目录内容
cd:更改目录,即切换到您试图访问的目录
rm:删除文件和目录

进入home文件夹:cd
向上移动一个级别:cd ..
返回上一个目录:cd -
在 Linux 中删除当前目录下的 test 目录的命令是:rm -r test
当前目录下有一个编译好的可执行文件 a.out,执行它使用的命令是:./a.out
Linux 中为文件改名使用的命令是:mv <旧文件名> <新文件名>
在 Linux 系统中,用于查看文件的大小的命令是:ls -l

编译器

Linux系统中c++的编译器是g++,c语言的编译器是gcc。

组合数学

加法原理

如果做一件事,完成它有m类不同的方法,在第1类方法中有\(n_1\)种不同的方法,在第2类方法中有\(n_2\)种不同的方法...在第m类方法中有\(n_m\)种不同的方法,那么完成这件事共有\(n_1+n_2+...n_m\)不同的方法。

乘法原理

如果做一件事,完成它需要m个步骤,做第1步有\(n_1\)种不同的方法,做第2步有\(n_2\)种不同的方法...,做第m步有\(n_m\)种不同的方法,那么完成这件事共有\(n_1n_2...n_m\)

例题

如果有红黄蓝绿四种颜色的旗子,那能传达几种信号(可以有旗子不用,但不能都不用也不能重复使用)。首先进行分类讨论,选旗子有选1个、2个、3个和4个的四种情况,然后对于这四种情况进行讨论。选1个时有红黄蓝绿4种情况;选2个时第一个旗子可以有4种选法(红黄蓝绿),第二个旗子可以有3种选法(除去已选的1种剩下的三种旗子),所以选2个有12种情况;以此类推,选3个有4×3×2=24种情况,选4个有4×3×2×1=24种情况。将选1个、2个、3个和4个的四种情况加起来4+12+24+24=64即为总的信号数。

排列组合

排列

从n个不同元素种取出m(\(m\leqslant n\))个不同元素,按照一定的排列排成一列,叫做从n个不同元素中取出m个元素的一个排列。因为这个排列中无重复元素,故又叫做无重复的排列。从n个不同元素中取m(\(m\leqslant n\))个不同元素的排列的个数记为\(A^m_n或P^m_n\),则
\(A^m_n=n(n-1)(n-2)...(n-m+1) = \frac{n!}{(n-m)!}\)
约定\(0!=1\)

组合

从n个不同整数取出m(\(m\leqslant n\))个不同元素并成一组,叫做从n个不同元素中取出m个元素的一个组合。因为这个组合中无重复元素,故又叫做无重复元素的组合。从n个不同元素中取出m(\(m\leqslant n\))个不同元素的组合的个数记为\(C^m_n或(^m_n)\),则
\(C^m_n = \frac{A^m_n}{A^m_m} = \frac{n(n-1)(n-2)...(n-m+1)}{m!} = \frac{n!}{m!(n-m)!}\)

可重复的排列

从n个不同元素中取m个元素(同意元素允许重复取出),按照一定的顺序排成一列,叫做从n个不同元素中取m个元素的可重复排列,这种排列的个数为\(n^m\)

可重复的组合

概念与可重复的排列类似,个数为\(C^m_{n+m-1}\)

圆排列

将n个不同元素部分首位得排成一圆,称为n个相异元素的圆排列,其排列种数为\((n-1)!\)

项链数

将n粒不同珠子用线串成一副项链,则得到的不同项链数当n=1或2时为1,当\(n\geqslant 3\)时,项链数为对应的圆排列数的一半,即\(\frac{1}{2}(n-1)!\)。当\(n\geqslant 3\)时,若n粒不同珠子的两个圆排列仅有顺时针和逆时针方向上的区别,则这两个对应的是同一副项链。所以当\(n\geqslant 3\)时,项链数为对应的圆排列数的一半。

错排

如若一个排列使得所有的元素不在原来的位置上,则称这个排列为错排。可以考虑用容斥原理或由递推公式推导通项公式。
若有n个元素,则方法数为\(n!(1-\frac{1}{1!} + \frac{1}{2!} -\frac{1}{3!} + ...+(-1)^n \frac{1}{n!} )\)

抽屉原理

抽屉原理又称狄利克原雷(Dirichlet)原理。

第一抽屉原理

如果将 \(m\) 个物件放入 \(n\) 个抽屉内,那么必有一个抽屉内至少有 \([\frac{m-1}{n}] + 1\) 个物件。

推广

如果将 \(m_1 + m_2 +…+ m_n + 1\) \((m_1,m_2,…,m_n\)均为整数\()\) 个物件放入 \(n\) 个抽屉内,那么或者第一个抽屉内至少有 \(m_1+1\) 个物件,或者第二个抽屉内至少有 \(m_2 + 1\) 个物件……或者第 \(n\) 个抽屉内至少有 \(m_n+1\) 个物件。

第二抽屉原理

如果将 \(m\) 个物件放入 \(n\) 个抽屉内,那么必有一个抽屉内至少有 \({m \over n} + 1\) 个物件,那么必有一个抽屉内至少有 \(m \over n\) 个物件。

推广

如果将 \(m_1 + m_2 + … + m_n - 1(m_1, m2, …m_n\)均为整数\()\) 个物件放入 \(n\) 抽屉内,那么或者第一个抽屉内至多有 \(m_1-1\) 个物件,或者第二个抽屉内至多有 \(m_2-1\) 个物件……或者第 \(n\) 个抽屉至多有 \(m_n -1\) 个物件。

协议

邮件协议:SMTP、IMAP、POP3
文件传输协议:FTP

OSI 七层模型(从第七层(最高层)开始)

应用层:应用程序协议,如文件传输,电子邮件,文件服务,虚拟终端。(如 HTTP)
表示层:信息的语法语义化及关联,如数据格式化,代码转换,数据加密。(如 LPP)
会话层:解除或建立与其他用户的联系(会话)。(如 RDP、SSH)
传输层:接收上层数据传给网络层,必要时分割,并保证有效到达对端。(如 TCP、UDP、SCTP)
网络层:控制子网运行,如逻辑编址、选择路由。(如 IP)
数据链路层:物理寻址,同时将原始比特流转为逻辑传输线路。(如 ARP)
物理层:以二进制数据形式在物理媒体上传输数据。(如 ISO 2110、IEEE 802、IEEE 802.2、Ethernet v.2、Internetwork)

专有名词和NOI、IOI相关知识

IT 表示信息技术。
计算机中央处理器的英文简称为 CPU。
ASCII 的含义是 美国信息交换标准代码。
现代计算机所应用的存储程序原理是 冯·诺依曼 提出的。
首届 NOI 是 1984 年举办的。
CCF指的是中国计算机学会。
这应该自己有资料的,就不赘述了。

求递归运行结果

普及组题目可考虑直接模拟求值。
若直接模拟难度较大则考虑逆推,如要求求出f(m, n),则一般可以求出f(0, 0)、f(1, 0)、f(2, 0) ... f(m, 0)以及f(0, 1)、f(0,2) ... f(0,n),然后可以根据递归函数求出f(1, 1)、f(1, 2)、f(1, 3) ... f(1, n)以及f(2, 1)、f(3, 1) ... f(4, 1)。以此类推,直到求出f(m, n)的值,然后可以根据求值的过程和结果寻找规律思考递归的作用。

数据存储空间

把所有数字按单位乘起来,注意最终单位,转化成题目要求的单位。

树、图问题

把抽象的树或图画出来。

满二叉树:每一层的结点数都达到最大值的树。
完全二叉树:除了最后(最下面)一层其他各层都满了的树,并且最后一层的节点都连续集中在左边。(如果用一维数组存有n个节点的完全二叉树,则数组中的第1~n位都有数)
k叉树:类比二叉树的定义,k叉树的结点可以有k个子节点。满K叉树和完全K叉树的定义也可以类别比满二叉树和完全二叉树。

前中后序遍历

前序(根左右),中序(左根右),后序(左右根)。
转换方法可见二叉树的前序、中序、后序遍历
或者可以考虑用栈解决。详见结合入栈出栈浅谈前序遍历,中序遍历,后序遍历

提醒

只有前序遍历和后序遍历是无法还原二叉树的。

数据结构

数组(array):内存空间为连续的一段地址,适用于提前已知所要存储的数据类型和数量、进行大量的查、改操作,不适用于含有大量交换、删除、增加数据的操作,该容器无法动态改变大小。
队列(queue):该容器内存结构最好为链式结构,特点是先进先出(FIFO,First In First Out),能动态调整大小,适用于包含大量增、删操作的情况,但不适用于含有大量查找操作的数据。
栈(stack):栈在内存上可为连续或者链式,于队列相反的是它为先进后出(FILO,First In Last Out),适用于压栈出栈操作,如可用于图的遍历、递归函数的改写等。
入栈顺序推导不可能的出栈顺序:先塞入第一个出栈的数之前的数(包括它本身),然后弹出第一个出栈的数。如果第二个出栈的数不在栈顶且在栈中,则这种出栈顺序不可能。然后是第二、三个数,以此类推。如果直至所有数都入栈、出栈一次都没有发生错误,则出栈顺序可能。
链表(list):链表在内存结构上为链式结构,也就决定它可以动态增加,适用于包含大量增加、删除的应用,但不适用于包含大量查询的操作。
链表和数组的比较:如果查找第i个数字时,数组可以随机访问,时间复杂度为O(1),而链表不支持随机访问,平均需要O(n);如果查找n在第几位时,链表时间复杂度均为O(1),数组时间复杂度为O(n)。

参考资料

https://www.cnblogs.com/yrjns/p/11246163.html(位运算)
https://blog.csdn.net/wan_ide/article/details/81108941(位运算)
https://www.cnblogs.com/yilang/p/11050115.html(进制转换)
https://zhuanlan.zhihu.com/p/118432554(原码,反码和补码)
https://zhuanlan.zhihu.com/p/37721614(编译型语言和解释型语言)
https://blog.csdn.net/Awt_FuDongLai/article/details/117227019(编程语言)
https://blog.csdn.net/wildand/article/details/91126833(RAM和ROM)
https://blog.csdn.net/qq_45722156/article/details/116332826(寄存器、缓存、内存)
https://zhuanlan.zhihu.com/p/420247468(Linux指令)
https://blog.csdn.net/qq_51756226/article/details/123902491(协议)
https://blog.csdn.net/Leader_wang/article/details/82959362(数据结构)
数学奥林匹克小丛书高中卷第三版组合数学

原文地址:https://www.cnblogs.com/niuerdao/p/17655202.html