1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > linux内核c语言笔试 C语言之linux内核--BCD码转二进制与二进制转BCD码(笔试经典)...

linux内核c语言笔试 C语言之linux内核--BCD码转二进制与二进制转BCD码(笔试经典)...

时间:2020-12-12 08:22:15

相关推荐

linux内核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码转二进制接口不尝试,原理一样。

C语言之linux内核实现位数高低位互换

linux内核实在是博大精深,有很多优秀的算法,我之前在工作中就遇到过位数高低位交换的问题,那时候对于C语言还不是很熟练,想了很久才写出来.最近在看内核的时候看到有内核的工程师实现了这样的算法,和我之 ...

C语言之linux内核实现最大公约数算法

最大公约数算法,又称欧几里德算法,至今已有几千年的历史了.在我们开始学习C语言的时候最常用的算法就是辗转相除法,其实在linux内核中,内核也是使用这样的方法实现两数最大公约数的计算. 两个整数的最大 ...

C语言在linux内核中do while&lpar;0&rpar;妙用之法

为什么说do while(0) 妙?因为它的确就是妙,而且在linux内核中实现是相当的妙,我们来看看内核中的相关代码: #define db_error(fmt, ...) \ do { \ fpr ...

C语言之linux内核可变参实现printf&comma;sprintf

昨天,我发表了一篇用可变参实现的fprintf函数,其实说实话还不完全是可变参实现的,因为用到了FILE * 这样的指针,需要包含stdio.h这个头文件才能实现这个函数,今天我们就来看看,如何抛弃s ...

C语言之linux内核实现平方根计算算法

关于平方根的计算,在linux内核中也有实现,就像math.h数学库里的sqrt这个函数一样. 平方根的公式定义: 如果一个非负数x的平方等于a,即 , ,那么这个非负数x叫做a的算术平方 ...

4&period;9版本的linux内核中实时时钟芯片pcf85263的驱动源码在哪里

答:drivers/rtc/rtc-pcf85263.c,内核配置选项为CONFIG_RTC_DRV_PCF85263 Location: -> Device Drivers -> Re ...

4&period;9版本的linux内核中实时时钟芯片pt7c4338的驱动源码在哪里

答:drivers/rtc/rtc-ds1307.c,内核配置项为CONFIG_RTC_DRV_DS1307 Location: -> Device Drivers -> Real Tim ...

go例子&lpar;一&rpar; 使用go语言实现linux内核中的list&lowbar;head

package list 代码 package list import ( "fmt" ) // 数据接口 type ElemType interface{} // 节点 type ...

《LINUX内核设计与实现》第三周读书笔记——第一二章

读书笔记--第一二章 5301张忻 估算学习时间:共2小时 读书:1.5 代码:0 作业:0 博客:0.5 实际学习时间:共2.5小时 读书:2.0 代 ...

随机推荐

bat命令

将DIR设置为当前文件所在的绝对路径 @echo off echo 当前盘符:%~d0 echo 当前盘符和路径:%~dp0 echo 当前盘符和路径的短文件名格式:%~sdp0 echo 当前批处理 ...

咏南C&sol;S开发框架支持最新的DELPHI XE8开发

特大好消息:咏南C/S开发框架支持最新的DELPHI XE8开发!咏南开发框架让你再无开发工具升级后顾之忧! 购买咏南开发框架送项目源码!

10 个 jQuery 的无限滚动的插件:

很多社交网站都使用了一些新技术来提高用户体验,而无限滚动的翻页技术就是其中一项,当你页面滑到列表底部时候无需点击就自动加载更多的内容. 下面为你推荐 10 个 jQuery 的无限滚动的插件: 1. ...

&lbrack;avalon&rsqb;data-repeat-rendered循环渲染完毕后的回调函数

有些时候需要在渲染完毕后,引用其他类似JQ插件的初始化工作.这时候需要使用data-repeat-rendered的回调函数. 应用场景: 在metro-start界面下,需要给每个tile引用cli ...

浅谈sql优化

问题的发现: 菜鸟D在工作的时候发现项目的sql语句很怪,例如 : select a.L_ZTBH, a.D_RQ, a.VC_BKDM, (select t.vc_name from tb ...

Linux 内核里的数据结构:红黑树(rb-tree)

转自:/slgkaifa/p/6780299.html 作为一种数据结构.红黑树可谓不算朴素.由于各种宣传让它过于神奇,网上搜罗了一大堆的关于红黑树的文章 ...

TP连接数据库报错:SQLSTATE&lbrack;HY000&rsqb; &lbrack;2002&rsqb; No such file or directory

连接数据库报错:“SQLSTATE[HY000] [2002] No such file or directory”. 出现这个问题的原因是PDO无法找到mysql.sock或者mysqld.soc ...

centos7的安装主要步骤选择

选择语言,选择英语 选择时区done确认选择 安全策略,选择默认 安装源文件 软件包选择,此处选择 最小安装 选择磁盘,并分区

Android - Android Studio 3&period;0去掉方法参数提示

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。