昨儿的移位运算被一个C++老鸟给误导了,不禁懊恼自己计算机组成原理学的太差了~!不多说了,进入正题!
BCD编码,百度百科上的定义解释的我云里雾里的,直接举例子说吧!
例如整数1和整数9,在计算机里用二进制存的话java是1个字节8位2进制数,即:
整数1: 0000 0001
整数9: 0000 1001
为什么会取1和9这两个数字呢,因为我们要存数字的话,无论多大的数字,每一位都是由0-9构成的,也就是每一位以二进制存的时候,高位都是0,这个就是BCD编码,有没有发现其实很浪费?!呵呵是的,浪费了高位的四个0.
如果将高位的四个0去掉,那么每一个字节(8位)就可以存进去两个数字,这样就会节约了存储空间,于是,压缩BCD编码也就诞生了~!于是上面的两个数字存储的时候,就变成了19H 在写法上,由于没有超过10,所以十六进制看起来和十进制的表现形式是一样的,但是不要被误导了哦~
(但是要说与此同时计算过程复杂度增加了,我还没有去考证,想来也是以时间换空间的例子吧.)
一般压缩BCD编码,都是要预留最高位作为符号位的,
例如我要存 3.14 ,转成压缩BCD码是 03H,14H
如果存-3.14 做法是这样的: 先将-3.14取绝对值,得到 03H 14H ,首位是0,其二进制表现形式(如今是4位) 0000 ,最高位取反的意思,也就是要将它变成1000 那么从0000到1000的运算,java里是用到了或运算,即是拿0|8即可.
(偶还是菜鸟,难免写的也会有误导人的地方,希望不足之处大家予以指正.也不要完全相信我写的,这个是我自己理解的BCD压缩码)