位运算 磁盘 CPU

位运算算法(& | ^ ~)

位运算的计算

首先将运算的两个数转换成二进制,然后按照与、或、非、异或的计算规则对于每一位进行计算:

与(&):在每一位上,两个数都是1的时候,该位记为1,只要有一个数是0,则记为0;

或(|):在每一位上,只要有一个数是1,该位记为1,两个数都是0的时候,则记为0。

异或(^):在每一位上,当两个数相同时,该位记为0,当两个数不同时,则记为1。(使用异或运算可以不引入第三个变量的情况下交换两个数)

非(~):将进行运算的数的每一位都进行取反,得到的结果是补码的形式。

a=55= 00000000000000000000000110111

b=177= 00000000000000000000010110001

a^b= 00000000000000000000010000110=134

k=~a= 11111111111111111111111111001000 → 该数为补码的表现形式

补码取反: 10000000000000000000000110111

转换原码: 10000000000000000000000111000=-56

位运算的意义

位运算支撑了整个计算机的运行,CPU内部进行的就是位运算,每一位都是一个电信号的对比,低电压是0,高电压是1。

电路接收电压信号后反馈出结果,对于一个与电路来说,当它接收两个高电压的时候才会输出一个高电压,否则输出低电压。

电路形成的原因

电脑的电路与一般电路的区别

计算机具备逻辑性的原因是计算机的电路不是死电路,而是变化的电路,具体体现在电阻的不固定,实现的方式就是在电路中加入很多的半导体,半导体可以在绝缘体和导体之间进行切换。

电脑上的线路在出厂的时候从物理意义上已经固定死了,如果想要产生逻辑性,就要产生变化的电路。

一般的电路的电阻是固定的,这样的电路当我们给它传输高电压的时候它就会输出高电压,传输低电压时就会输出低电压,传入的电压越高,输出的电压就越高,这样的电路无法具备逻辑性。

与电路和或电路

与电路中,当你输入两个低电压时它输出一个低电压,当你输出一个高电压和一个低电压时它同样输出低电压,这意味着电阻随着电压的增强也跟着在增强,直到两个都是高电压时才允许输出一个高电压信号。

或电路中,输入两个低电压信号时输出一个低电压信号,输入一高一低电压的信号时就会输出高电压信号,两个高电压的情况下仍然只是输出一个高电压,并不会因为输入的电压升高而输出一个更高的电压。

计算机具有逻辑性的原因

在电脑的电路中存在很多的半导体,如果只传一个电压信号的话,只出一个电压信号,这样电路的灵活性就比较低。所以很多硬件中都是很多不同的电压组合起来作用在不同的半导体上的。我们传入不同的电压,然后不同的电压组合,会让里面的每个半导体在导体和绝缘体之间不断切换,于是这个电路就具有逻辑性了。所以计算机才产生了智力。

然而CPU不是这种复杂的半导体电路,复杂的半导体电路是用于进行复杂的逻辑处理的硬件之中,例如硬盘。CPU中只有输入两个电压输出一个电压的这种简单的半导体电路

*注:因为半导体的主要材料是硅,通过硅生产出来的半导体赋予了计算机以智力,所以美国的计算机圣地就叫做硅谷。

硬盘

硬盘分为机械盘与固态盘。在硬盘上存在着一圈圈的磁道,存储着0101的信息。在计算机中,数据的传输是依靠高低电压的,高电压代表1,低电压代表0。而在存储方面,在机械硬盘中对数据的存储是依赖磁颗粒的。

固态盘

固态盘的传输速度比机械盘高几十倍到上百倍,然而互联网大公司以及银行政府机关等需要长期存储数据时使用的是机械盘为主,原因如下:固态盘和机械盘的存储区域都是分成了许多的扇区,固态硬盘的每一个扇区存在固定的读写次数,大概几十万次,超过了读写次数后这个扇区就会报废。

机械盘
机械盘存储数据持久的原因

因为在磁盘表面存在着一层很薄的保护膜,因此磁盘的双面看上去都很光滑(光盘是单面光滑),存储数据比较持久。机械盘的存储依赖的是磁颗粒,磁颗粒的读写次数理论上是永久无限的。原因如下:

(1)磁颗粒的磁性在自然情况下是永久保留的;

(2)对磁颗粒进行读写操作的方式是:

①读取磁颗粒的磁信息;

②对磁颗粒的磁信息进行电磁转换,施加强电压改变其磁场,基本上是可以无限次数地加电压改变其磁极的。

读取磁颗粒的方式

在读取磁颗粒的过程中,我们使用的是磁头机械臂,同时磁盘还会产生旋转,在旋转过程中磁道会和磁头发生相对位移,在磁盘上镶嵌着很多的磁颗粒,每一个磁颗粒都有着自己的磁场,都有N极和S极,就要看对外的是什么磁极,当对外的磁极是N就表示1,S表示0。

当磁头和磁道发生相对位移时,磁头就切割了磁颗粒的磁感线,因此产生了电压信号并传到内存里面去。

但是当磁头靠近磁颗粒的时候产生了正向电压,远离时产生了负向电压,而我们说的0101应该是高低电压,至少是同向的,但是这里产生了正反电压,为了改变正反电压,我们给磁头赋予一定的基础电压,该基础电压只要大于正负电压的绝对值,这样就都会产生同向的、大小不同的电压了。

在这个过程中会产生两个高低的电压,但是只经过了一个磁颗粒,因此我们读取的不是电压本身,而是电压的变化是从低到高还是从高到低,这一点就像是在计算机网络中,曼彻斯特编码就是根据电压的变化判断是1还是0。

在内存和CPU中不存在磁场,也就不存在磁感应线的切割,内存是靠着一个个小电容和CPU进行交换,电容中存储的电压不一样,所以在内存和CPU中就是通过高低电压判断0和1。而在磁盘中,“0是低电压,1是高电压”这只是最简单的说法,实际上是看电压的变化率

读取硬盘上某区域的数据

(1)将磁头对准该磁道;

(2)磁盘进行旋转,旋转到要读取的区域的位置;

(3)在想要读取的区域产生相对位移,产生电压,成功读取数据并传出。

产生的问题:在读取到自己想要读取的区域之前,磁头已经和磁道产生了相对位移,因此会产生不需要的数据,而作为闭合电路,这样产生的数据不可避免地会往内存中传输,应该如何解决这个问题?

解决方式:在磁道上,每一份数据数据前都会有一排一排的磁颗粒表示其地址,即:

磁颗粒(地址)——数据——磁颗粒(地址)——数据——磁颗粒(地址)这样的形式

磁头扫描过磁道时,产生的数据是一排一排的,而这些数据都要经过一个过滤器,只有通过过滤器的识别才可以得到放行。

过滤器是一种电开关,在其内部存在很多的半导体。当我们想要某段数据的时候,CPU会下达一个地址指令,以表示只想要这个地址的数据。

地址本身也是1010数据,即地址也是电信号。地址进入过滤器后会作用在半导体上。

扫描地址的过程中,每传输一段数据,就会在其之前先扫描这段数据的地址,将该数据地址的电压信号传输进过滤器。

如果传输进来的地址与CPU下达的地址相匹配,则会在它们的共同作用下,将过滤器中的半导体全部打通(切换成导体),并将这段地址后的数据全部放行通过过滤器。

如果传输进来的地址与CPU下达的地址不匹配,则它们无法共同作用在半导体上使其成为闭合电路(无法打通),数据就无法通过过滤器。

这样的判断属于电开关,判断速度极快,因此只需要这些半导体就可以实现逻辑判断。

CPU

CPU的电路并不像磁盘这么复杂,因为CPU需要关注其计算速度。

该图表示CPU中有14个核心,每个核心的速度是2.3GHz。1G就是2^30即10亿多,2.3G也就是25亿次多。也就是说每个核心每秒进行25亿次多的计算量。

电流每秒钟的传播速度:在金中 20万km/S;在铜中 16万km/s。

因此金子在工业中会用作电路,除了传播速度以外,延展性也是十分关键的考量。

为什么CPU叫做集成电路

在很多CPU中的导线都是用金子做的,如果是一个特别复杂的电路,假如100万KM,用金子做的都得跑5秒才能接受一个电压信号,而在一条电路上同时只能传输一个电压信号,无法同时传输多个,无论放多少个电压指令进去也只能计算一个信号,这种时候运算速度会很慢,所以CPU内部必然不是一个整体的大型复杂电路,而是一个一个独立的互不影响的小电路,这种情况下才能同时计算,独立电路越密集,同时进行的运算就越多。所以CPU才叫做集成电路。

CPU设计的问题

(1)如何把这些小电路的信息汇总起来,这里的汇总并不是将信号成一个电压信号传出去,而是汇总成一排电压信号传出去,如何进行这一步。

(2)如何给这一堆小电路传信息。一根导线同时只能传一个电压信号,所以肯定不能是使用一根导线给一个小电路传信息,否则它也没办法进行计算了。因此一定是一堆电路给CPU传信息,然后再由每个小电路进行计算。

信息传输的速度

假设AB之间距离是20万km,从A点将一个0101010101的信息传输到B点,一根线上不能同时存在多个电压信号,因此传10bit的信号就需要10秒钟。

假设在AB中间加一个中转站,A到中转站和中转站到B的距离都是10万km,这样就会出现两根导线传输信号,这种时候一个信号只需要0.5秒就能从A传输到中转站,然后再从中转站传输到B,当中转站传输信号给B的时候,A同时也可以将一个新的信号传输到中转站,这时的两根导线就可以同时传输两个不同的信号,整个线路的传输时间就减少到了5.5秒。

因此,中转站越多时,信号的传输就越快。

CPU内部的多级传导
CPU的限制

CPU和内存通过总线(导线)相连,CPU的计算核心要想从内存取数据的话大概是20纳秒,这个速度很难再提升了,原因:(1)线路的长度很难再缩短了;(2)物理方面的传输已经受限了。现在的CPU性能提升主要在两块:(1)高速缓存提升;(2)多核提升。而单核的计算量和十年前没什么区别,因为物理方面受限。

CPU设计的关键点

CPU的设计要实现内部小电路数量多,同时对外传的导线又少,切换又更方便。

(1)导线数量不能太多

(2)传输如何加多层的中继。

CPU内部的传输结构

CPU-寄存器-L1高速缓存-L2高速缓存-L3高速缓存-内存

寄存器:离CPU最近的是寄存器,每个CPU都有自己对应的寄存器,暂存最急缺的数据,下一步要干什么。

高速缓存:高速缓存对于并发也很关键。高速缓存支持多个CPU,没有高速缓存CPU无法多核,除此之外,高速缓存还通过多级传导的方式提升了传输速度。

高速缓存越多,离CPU越近,越难再压缩距离,也就越难提高级数。所以目前的难题就是怎么样去设计多级,包括转换指令之类的。传输分成多级,多级之间也有相应的额外指令去管理传输,也是额外的小损耗。

位运算的一些应用

(1)使用与运算确定一个数某一位是否是1,使用场景:计网里网关判定,子网划分。

        假如 k & 10000 = 10000 ;则我们可以得出k的第五位数是1;

        假如 k & 10000 = 0 ;则我们可以得出k的第五位数是0。

(2)使用异或交换两个数值a和b。

a=55= 00000000000000000000000110111

b=177= 00000000000000000000010110001

a=a^b= 00000000000000000000010000110=134

b=a^b= 00000000000000000000000110111=55→原来的a

a=a^b= 00000000000000000000010110001=177→原来的b

因此,只需要 a=a^b→b=a^b→a=a^b,就可以完成对a和b两个数字的交换。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值