关于数据运算的分享~
再次声明,因为最近学习计算机导论方面的东西,本文中的很多信息是从《计算机科学导论》中获取的。博文怎么样不知道,但是就我而言,书还是最好的知识传播的媒体。
该书的链接如下:
http://item.jd.com/11758229.html
不是做广告哈,只是想指引同我一样刚涉入计算机殿堂的同仁们,找本好书,很重要。
好了,继续计算机中的数据运算。
上文介绍了,数据如何在计算机中保存。因为最终的形式都是二进制数码,所以对此的运算,不同于我们日常中使用的算术运算或者其他。那么日常生活中的运算中,有哪些呢?
因为暂时找不到什么资料,我先做如下总结:
1)算术运算:这个不用说了,平时卖个菜什么的,找零多少;从小就背的九九乘法口诀,这都是算术运算了;
2)关系运算:比如,我比你大,你比我矮什么的,(好像比来比去,都是我比你有优势哈,不好意思),这种大于,小于,等于等等之类的,都是关系运算;
3)集合运算:集合中的,并啊,交啊,这些都是集合中的运算;比如你们班15个人,其他班14人,一共多少人?这样听起来貌似算术运算,应该是有一定关系的吧,我也解释不清;
4)逻辑运算:与、或、非,这些简单的运算了,学过数字电路的肯定是感触更深;
如上没什么根据的,可以作为呓语。百度百科中对运算的解释如下:
运算,数学上,运算是一种行为,通过已知量的可能的组合,获得新的量。运算的本质是集合之间的映射。
好吧,可以看出,如上红色部分,运算的本质是集合之间的映射,貌似概括出了运算的本质。
但是计算机中,最底层都是二进制数码,任何计算投射到底层,都可以简单分为如下几类运算:
1)逻辑运算:非(NOT),与(AND),或(OR),异或(XOR,exclusive-or)。这里就介绍下异或,平时用的少,数字电路或者逻辑分析中用的可能多些,exclusive就是排外的意思。异或和或比较相似,也是相反的运算结果,同样都是二元运算符。
或,比如输入两个二进制数码,至少有一个是1,那么结果就是1,除非两个输入都是0,否则结果都是1;异或,只要两个相同的数码,那么输出就是0,只要输入的两个字码不同,那么就是1。异或针对的是输入的两个数码是否相同,相同反馈0,不同反馈1,其本质倾向于两个输入要不同,也是进行了如上的筛选。
2)移位运算:因为底层都是一堆二进制数码,0或者1排列出来的二进制位模式,或说流,那么左移一位,右移两位什么的,就会形成特定意义的运算。
包括逻辑移位和算术移位两种。逻辑移位,就是简单的二进制流左移右移什么的;算术移位,也是左移右移什么的,但是有了特殊意义,其针对的是整数的算术运算,在二进制中,左移一位相当于乘以2,右移一位相当于除以2,但是这里要关注最左边符号位的影响。
3)算术运算:这就是我们理解的四则运算了,加减乘除。
这是因为,如果对二进制数码(这里主要是指代表了实数或者整数的二进制数码)进行四则运算,将其用十进制的算法逻辑已经行不通了,二进制数自然可以有一套自己的加减乘除运算逻辑,比如针对加减,为了减少硬件设计的开支,减法可以设计为二进制补码的方式来规避,也就是说,A - B = A + B~,因为我打不出B+上标的形式,就用B~来代替吧,也就是说A减B,等于A加B的补码,这样子起码我们在设计硬件支撑时,只需要加法器,不用减法器了。
另外,针对乘除,虽然可以使用重复的加减来实现,但是这种程序设计是低效的,有更高效的程序,如Booth程序,来完成二进制数码的乘除运算。这里的Booth程序,后面要展开。
如上的意思,其实整理出来就是,要尊重二进制数码,其自有一套适用于自身的运算逻辑,我们不要把十进制的算法逻辑或者认知简单的强加于二进制,二进制需要哪些运算,二进制如何实现哪些预算,都是有一套自己的逻辑的,这种逻辑是不是适用,主要是根据效率来选取的。
另外,针对实数的加减法:以浮点数存储的实数的加法和减法被简化为小数点对齐后以符号加绝对值格式(符号和尾数的组合)存储的两整数的加法和减法。这里面说的,符号加绝对值格式的整数加减法运算逻辑如下:
整数的加减法,一种是使用二进制补码格式,另一种就是符号+绝对值整数,这里的符号就是正负号(+ 或者 -)。在使用符号加绝对值格式的算法时,首先比对符号是否相同,相同的话,就将后面的无符号整数位简单相加,再在前面加上符号位就好了,如果不同的话,那就要比对后面整数位哪个大了,当然要取大的那一个的符号位作为结果的符号位,比如-5 + 3,那肯定要取-5的符号位,也就是负,作为最终结果的符号位,而结果的无符号整数位则是两个输入值无符号整数位相减的结果,这里的减法又是运用了二进制补码格式。
有意思的是,在符号加绝对值格式中的加减法中,如上所说的比对两个符号位是否一致时,就可以用上述所说的异或运算了,挺有意思,马上就是说出了一个异或运算的使用场合。
如上的介绍,很多都是和前一章,也就是数据存储,强相关的,可以一起来看下。
计算机底层的数据运算,其实就这么简单了。三种运算,逻辑运算、移位运算、算术运算。