1. 程式人生 > >C語言之linux核心--BCD碼轉二進位制與二進位制轉BCD碼(筆試經典)

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 進行修正。
有點哆嗦,接下來我們直接來看看程式碼:
#include <stdio.h>
#include <stdlib.h>
//BCD碼轉為二進位制 
unsigned bcd2bin(unsigned char val)
{
	return (val & 0x0f) + (val >> 4) * 10;
}

//二進位制轉為BCD碼 
unsigned char bin2bcd(unsigned val)
{
	return ((val / 10) << 4) + val % 10;
}

int main(void)
{
	unsigned  val =  17;
	printf("bin:%u--->0x%x\n",val,val);
	printf("bcd:%u--->0x%x\n",bin2bcd(val) , bin2bcd(val));
	return 0 ;
}
執行結果: 從結果可以看出17的二進位制數是0001 0001---->對應16進位制0x11 將17轉為BCD碼後4個位表示一個位,所以就表示為二進位制數0001 0111----->對應16進位制數0x17也就是十進位制的23
總結: BIN碼:就是二進位制數  BCD碼:原則是從低位開始分別以四個Bit表示一個位,BCD碼就是十進位制的二進位制數 另外一個BCD碼轉二進位制介面不嘗試,原理一樣。