在分析代码之前,我们先来了解一下,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码转二进制接口不尝试,原理一样。


最新文章

  1. ADO.net
  2. SVN Server for Migration
  3. UVa 10917 Dijkstra
  4. html嵌套表格示例
  5. Linux系列笔记 - 用户以及用户组命令
  6. CAS认证原理图
  7. C#事件与接口
  8. C++@重载函数
  9. 20145305 《Java程序设计》第9周学习总结
  10. MVC4.0 利用IActionFilter实现单一Action返回多种结果
  11. Android好用且常用的插件及工具
  12. Asp.Net异常:&quot;由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值&quot;的解决方法
  13. 编程是一项需要时间来掌握的技能(Anders的经验)
  14. org.apache.jasper.JasperException: java.lang.ClassCastException
  15. 千万别用模板给的list.size()巨坑
  16. 【集美大学1411_助教博客】团队作业3——需求改进&amp;系统设计 成绩
  17. Page.Cache
  18. shell read变量的读入
  19. JSTL-简介
  20. vue生命周期理解图

热门文章

  1. Effective C++ ——设计与声明
  2. Linux--FTP和MAIL服务器
  3. 14 Fragment 碎片总结
  4. 编译GDAL支持MySQL
  5. 插件前奏-android黑科技 hook介绍
  6. C++编写ATM
  7. Swift基础用法(Swift开发之一)
  8. 通过邮件找回密码功能的Java实现
  9. 怎么在Eclipse中添加VI插件
  10. Android PackageManager源码浅析以及静默安装实现方式