天天看點

C語言之linux核心--BCD碼轉二進制與二進制轉BCD碼(筆試經典)

在分析代碼之前,我們先來了解一下,bcd碼和二進制到底差別在哪?

      學習過計算機原理的和數字電子技術這兩門課的都會知道這兩個到底是什麼含義,也有的同學學過了,考過了,過了一段時間又忘記了,今天,我們通過一個代碼案例來說說:

     我們先查查百度,了解一下bcd碼:

bcd碼(binary-coded decimal‎)亦稱二進碼十進數或二-十進制代碼。用4位二進制數來表示1位十進制數中的0~9這10個數位。是一種二進制的數字編碼形式,用二進制編碼的十進制代碼。bcd碼這種編碼形式利用了四個位元來儲存一個十進制的數位,使二進制和十進制之間的轉換得以快捷的進行。這種編碼技巧最常用于會計系統的設計裡,因為會計制度經常需要對很長的數字串作準确的計算。相對于一般的浮點式記數法,采用bcd碼,既可儲存數值的精确度,又可免去使電腦作浮點運算時所耗費的時間。此外,對于其他需要高精确度的計算,bcd編碼亦很常用。

由于十進制數共有0、1、2、……、9十個數位,是以,至少需要4位二進制碼來表示1位十進制數。4位二進制碼共有2^4=16種碼組,在這16種代碼中,可以任選10種來表示10個十進制數位,共有n=16!/[10!*(16-10)!]等于8008種方案。常用的bcd代碼列于末。

bcd碼可分為有權碼和無權碼兩類:有權bcd碼有8421碼、2421碼、5421碼,其中8421碼是最常用的;無權bcd碼有餘3碼,餘3循環碼等。

bcd碼的運算規則:bcd碼是十進制數,而運算器對資料做加減運算時,都是按二進制運算規則進行處理的。這樣,當将

bcd碼傳送給運算器進行運算時,其結果需要修正。修正的規則是:當兩個bcd碼相加,如果和等于或小于 1001(即十進制數9),不需要修正;如果相加之和在

1010 到1111(即十六進制數 0ah~0fh)之間,則需加 6 進行修正;如果相加時,本位産生了進位,也需加 6 進行修正。這樣做的原因是,機器按二進制相加,是以

4 位二進制數相加時,是按“逢十六進一”的原則進行運算的,而實質上是

2 個十進制數相加,應該按“逢十進一”的原則相加,16 與10相差 6,是以當和超過 9或有進位時,都要加 6 進行修正。

有點哆嗦,接下來我們直接來看看代碼:

運作結果:

從結果可以看出17的二進制數是0001 0001---->對應16進制0x11

将17轉為bcd碼後4個位表示一個位,是以就表示為二進制數0001 0111----->對應16進制數0x17也就是十進制的23

C語言之linux核心--BCD碼轉二進制與二進制轉BCD碼(筆試經典)

總結:

bin碼:就是二進制數 

bcd碼:原則是從低位開始分别以四個bit表示一個位,bcd碼就是十進制的二進制數

另外一個bcd碼轉二進制接口不嘗試,原理一樣。

繼續閱讀