【大前端 nodejs】计算机组成原理的面试题
前言
以下题目是有60%是我以前面试前端真的遇到的面试题。例如,成都的字节,阿里,北京的阿里,腾讯还有一些中小公司。
感谢star,是我完善文档的动力
什么是补码?有什么用?
补码是计算机中用来表示负数的一种方法。在计算机中,所有的数据都是以二进制的形式存储的,而补码就是一种将负数转化为二进制的方法。
在补码中,最高位表示符号位,0表示正数,1表示负数。对于一个n位的二进制数,其补码就是将其对应的正数的二进制表示取反(0变1,1变0),然后再加1。例如,对于一个8位的二进制数,其补码就是将其对应的正数的二进制表示取反,然后再加1。
举例: 在JavaScript中,可以使用按位非(~)运算符来实现取反操作,使用按位与(&)运算符来实现加1操作。以下是一个实现减法运算的例子:
function subtract(a, b) {
b = ~b + 1;
return a + b;
}
一个中文占多少字节?这个跟编码有什么关系?Unicode跟编码有什么关系?js是什么编码?
一个中文字符占用多少字节跟编码密切相关,不能直接说一个中文占2个或者3个字节,比如UTF-8编码下一个中文字符占用3个字节。
Unicode是一种字符集,它定义了每个字符对应的唯一编号,但是并没有规定如何存储这些字符。编码则是将字符集中的字符转换为字节序列的方法。
在JavaScript中,通常使用UTF-16编码。
为什么0.1 + 0.2不等于0.3?请结合IEEE标准来说,如何避免这种计算误差
在计算机中,浮点数的表示采用的是IEEE 754标准。在这个标准中,浮点数被表示为一个符号位、一个阶码和一个尾数的组合。
其中,符号位表示正负,阶码表示指数,尾数表示小数部分。对于单精度浮点数,符号位占1位,阶码占8位,尾数占23位。对于双精度浮点数,符号位占1位,阶码占11位,尾数占52位。
在IEEE 754标准中,浮点数的表示是有限的,而0.1和0.2在二进制下是无限循环小数。
因此,它们在转换为浮点数时会被截断为一个近似值。这个近似值与0.3的近似值不相等,因此0.1 + 0.2不等于0.3。
避免方法可以使用将数字转化为字符串,然后模拟加法运算,一些库就是这样实现的,可以完全避免出现误差。(千万别说可以用乘法转换为整数做运算,也一样会有误差)
也可以使用NumberFormat API(兼容IE11),完全可以用到生产环境
const nf = new Intl.NumberFormat('en-US', { minimumFractionDigits: 1 });
const result = nf.format(0.1 + 0.2);
console.log(result); // "0.3"
进制转换:任意进制如何转化为十进制
例如:2进制101.1如何转化为10进制。(有些同学觉得可以用parseInt('101.1', 2),这个是不行的,因为parseInt返回整数) 转化方法如下(按权相加法):
2进制的 101.1 = 1 x 22 + 0 x 21 + 1 x 20 + 1 x 2-1
规律就是二进制的每个数去乘以2的相应次方,注意小数点后是乘以它的负相应次方。
进制转换:十进制整数转为任意进制
例如: 把89化为二进制的数
89÷2=44 余1
44÷2=22 余0
22÷2=11 余0
11÷2=5 余1
5÷2=2 余1
2÷2=1 余0
1÷2=0 余1
然后把余数由下往上排序
1011001
这样就把89化为二进制的数了
进制转换:十进制小数转为n进制
我们还是以2进制为例,方式是采用“乘2取整,顺序排列”法。具体做法是:
- 用2乘十进制小数,可以得到积,将积的整数部分取出-
- 再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出-
- 如此进行,直到积中的小数部分为零,或者达到所要求的精度为止
所以n进制是一个道理 我们具体举一个例子 如: 十进制 0.25 转为二进制
0.25 * 2 = 0.5 取出整数部分:0
0.5 * 2 = 1.0 取出整数部分1
即十进制0.25的二进制为 0.01 ( 第一次所得到为最高位,最后一次得到为最低位)
CPU和GPU的区别,前端如何利用GPU加速?
CPU和GPU的区别在于,CPU是一种通用处理器,适用于各种计算任务,而GPU则是一种专用处理器,适用于并行计算任务,例如图形渲染。
GPU具有大量的计算核心和高速内存,可以同时执行大量的计算任务,因此在处理大规模数据和并行计算任务时,GPU比CPU更快更高效。
前端可以利用GPU加速来提高图形渲染和计算性能。
在浏览器中,GPU加速可以通过CSS属性来开启。以下是一些常用的CSS属性,可以开启GPU加速:
- transform
- opacity
- filter
- will-change
- 等等
I/O 是什么?CPU是如何处理I/O请求的
I/O是指输入/输出,是计算机系统中的一种基本操作。计算机通过I/O设备与外部世界进行交互,例如读取文件、打印文档、显示图像等。
我们拿CPU通过通道控制部件来管理I/O设备举例,CPU不需要帮它安排任务,只需要简单的发出启动和停止类似的命令,通道部件就会自动的安排相应的I/O设备工作。简单流程如下:
- 1、CPU向通道发出I/O指令,指明通道程序在内存中的位置,并指明要操作的是哪个I/O设备,之后CPU就切换到其他进程执行了。
- 2、通道执行内存中的通道程序(其中指明了要读入/写出多少数据,读/写的数据应放在内存什么位置等信息)
- 3、通道执行完规定的任务后,向CPU发出中断信号,之后CPU对中断进行处理
转载自:https://juejin.cn/post/7213933109720760376