昨兒的移位運算被一個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壓縮碼)