程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言之linux內核--BCD碼轉二進制與二進制轉BCD碼

C語言之linux內核--BCD碼轉二進制與二進制轉BCD碼

編輯:關於C語言

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 
#include 
//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碼轉二進制接口不嘗試,原理一樣。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved