c++将十进制转换为二进制 小数_进制及其转换

  • 为什么要用到二进制?

数字电路非常广泛,小到逻辑门电路,大到超大规模集成电路,手机,电脑,智能设备……数字信号即可以表示数字,也可以表示非数值的信息,如文字,声音,图片,视频。如何将这些非数值类的信息 变成 二进制信号呢?这就涉及到编码制度,即将信息通过编码的方式转成二进制值,如 MP3、MP4、midi、jpg、gif 等等

  1. 从可行性来说,采用二进制,只有 0 和 1 两个状态,能够表示 0 和 1 两种状态的电子器件有很多,比如开关的接通和断开、晶体管的导通和截止、磁原件的正负剩磁、电位电平的高低等都可以表示 0 和 1 两个数。使用二进制,电子器件具有实现的可行性。

  2. 从运算的简易性来说,二进制的运算法则少,运算简单,使计算机运算器的硬件结构大大简化(十进制乘法九九口诀有 55 条公式,而二进制乘法只有四条规则)。

  3. 从逻辑上讲,由于二进制 0 和 1 正好和逻辑代码假和真相对应,有逻辑代数的理论基础,用二进制表示二值逻辑很自然。 -摘自计算机为什么是二进制?

  • 十进制是“十进”,采用的是“个/十/百/千/万...”的进位递增
  • 二进制是“二进”,采用的是“1/2/4/8/16/...”的进位递增

da1acddfeaed56ecdad7a9e231a569ca.png

基数和位权

在十进制系统中(基数 10),数4327.13表示

,其中的 10 就是我们所说的基数,基数在不同数制转换中起着重要作用。我们用数字我们知道多位数有很多位,有十位、百位和千位,处在每个位上的单位
1表示的数值大小不同,十位上的数字 1代表 10 ,百位上的数字 1 代表 100,以此类推,故我们称
为位权 ,也称比重
(以 10 进制为例)

常见的进制

计算机中的任何数据都可以用一串 0 或 1 来表示,但考虑到二进制数位太长,所以我们也可以采用八进制和十六进制来表示数值数据。为了避免出现误会,在给出一个数的同时就必须指明这个数的数制,例如:(1010)2、(1010)8、(1010)10、(1010)16所代表的数值就不同。除了用下标来表示不同的数制以外,在计算机中还常用后缀字母来表示不同的数制。后缀 B 表示这个数是二进制数(Binary);后缀 Q 表示这个数是八进制数(Octal),本来八进制数的英文单词的第一个字母应当是 O,因为字符 O 与数字 0 太容易混淆,所以常使用字符 Q 作为八进制数的后缀;后缀 H 表示这个数是十六进制数(Hexadecimal);而后缀 D 表示这个数是十进制数(Decimal)。十进制数在书写时后缀 D 可以省略,其他进制在书写时后缀一般不可省略。例如:有 4 个数分别为 375D、101B、76Q、A17H,从后缀字母就可以知道它们分别是十进制数、二进制数、八进制数和十六进制数。

程序员们更喜欢采用程序设计语言的记号来表示不同进制的数,这就是前缀表示法,例如:在 C 语言中,八进制常数以前缀 0 开始,十六进制常数以前缀 0x 开始。

  • 十进制

    特点:有 10 个基数:0、1、2、3、4、5、6、7、8、9 写法:

  • 二进制

    特点:有两个基数:0、1 写法:

  • 八进制

    特点:有八个基数:0、1、2、3、4、5、6、7 写法:

  • 十六进制 特点:有十六个基数:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F 写法:

4221c28f5681f322a5b894199c27c235.png

其实0~9 和 a~f都只是符号而已,如果采用 n 进制,那么我们就用到 n 种符号来排列组合即可,当然,符号是可以重复的

进制转化

  • 整数转换

转换 正整数 的进制的有一个简单算法,就是通过用目标基数作长除法;余数给出从最低位开始的“数字”。

a 进制转化为 b 进制,除 r 取余数,直至商为零,余数倒序排序

例如,1020304 从 10 进制转到 7 进制:

68baea28403a85dacfdcdfedb44451f1.png

再如,10110111 从 2 进制到 5 进制:(注意:b 要先转换成 a 的进制 )

b688497d482ae08e5ce4ef632a71f68a.png
  • 记忆口诀:除 b 取余,逆序排列

  • 其他进制转换与二进制的相互转换

bc423146f0371aaa662d754af9e8eb11.png

二进制转换为八进制,采用“3 位并 1 位”,按从右向左方向,每 3 位二进制位一组,最高位不足 3 位,添 0 补足 3 位,然后将各组 3 位二进制数加权展开,得到八进制数。

78a4761bc3b801f316be7d35347ef9fe.png
  • 小数转换

转换一个“十进制” 小数,可以用重复乘法,将整数部分作为“数字”。不幸的是有限小数不一定转换成为有限小数,例如 0.1A4C 从 16 进制转换到 9 进制:

2ca181b5031f1fcd7cb9721b33b9f53c.png
  • 记忆口诀:1取整,顺序排列 (1 在这里指的是位权)

进制的简单运算

  1. 二进制加法:1+0=1、1+1=10、11+10=101、111+111=1110

5d41448914e9536afffd154853b7269b.png
  1. 二进制减法:1-0=1、10-1=1、101-11=10、1100-111=101

f9c07a47b517f9f001236a139ae83b63.png
  1. 八进制加法:3+4=7、5+6=13、75+42=137、2427+567=3216

1446879cc5858dfc4ad4a5580877d3d0.png
  1. 八进制减法:6-4=2、52-27=23、307-141=146、7430-1451=5757

8f6293fefb97deb0ecbd4e47e82b78d8.png
  1. 十六进制加法:6+7=D、18+BA=D2、595+792=D27、2F87+F8A=3F11

e9487bbc1251b2d0cd89f9031316dd55.png
  1. 十六进制减法:D-3=A、52-2F=23、E07-141=CC6、7CA0-1CB1=5FEF

2e4cec3e8048f1ebf72c85efc799ef6b.png

乘法和除法相对来说比较复杂,涉及到逻辑门运算,属于计算机组成原理中的内容,先挖个坑,日后再填

  • 二进制是如何将加减乘除变换为加法实现的?

加法是如何由逻辑运算与、或、异或来实现的?

总结

  • 十进制(D),二进制(B),八进制(O),十六进制(H)

以上内容只是说了进制转换中如何计算的问题,是一种机械化的理解。以前见到过一篇关于进制的文章,写的很好,可我现在找不到了,遗憾。进一步用代码理解进制 理解进制转换的原理

要注意的几个地方:

  1. 在进行进制转换时,长除法中的除数的进制和被除数的进制要保持一致
  2. 从小数点位置开始,整数部分向左,小数部分向右,每四位二进制为一组用一位十六进制的数字来表示,不足四位的用 0 补足
  3. 十进制转其他进制:整数部分用除基取余法,小数部分用乘基取整法,然后将整数与小数部分拼接成一个数作为转换的最后结果

其他数制转为 十进制 ,套公式即可(b=10)。一般来讲,b 进制系统中的数有如下形式:

ac37ffc5f49cde993f4d0ed2e573dbd0.png
  • 看完这个我笑了 hiahiahia

拓展阅读

二进制是计算机最适合的数据表示方法,把十进制数的各位数字变成一组对应的二进制代码,用 4 位二进制数来表示 1 位十进制数,称为二进制编码的十进制数(Binary Code Decimal),即 BCD 码。4 位二进制数可以组合出 16 种代码,能表示 16 种不同的状态,只需要使用其中的 10 种状态,就可以表示十进制数的 0~9 十个数码,而其他的 6 种状态为冗余状态。由于可以取任意的 10 种代码来表示 10 个数码,所以就可能产生多种 BCD 编码。BCD 编码既具有二进制数的形式,又保持了十进制数的特点,可以作为人机联系的一种中间表示,也可以用它直接进行运算。下图列出了几种常见的 BCD 码。

bbf8c725f610e83b544b27dd856069db.png
  • 8421 码

8421 码又称为自然(Nature)BCD 码,简称 NBCD 码,4 位二进制代码的位权从高到低分别为 8、4、2、1,这种编码的主要特点是:

  • 它是一种有权码,设其各位的值为 b3b2b1b0,则它所表示的十进制数为 D=8b3+4b2+2b+1b0
  • 简单直观。每个代码与它所代表的十进制数之间符合二进制数和十进制数相互转换的规则
  • 不允许出现 1010~1111。这 6 个代码在 8421 码中是非法码。

注意:尽管在 8421 码中 0~9 十个数码的表示形式与用二进制表示的形式一样,但这是两个完全不同的概念,不能混淆。例如,一个两位的十进制数 39,它可以表示为(00111001)421 与 100111B,这两者是完全不同的。

  • 2421 码

这种编码各位的位权从高到低分别为 2、4、2、1,其主要特点是:

  • 它也是一种有权码,所表示的十进制数为 D=2b3+4b2+2b1+1b0
  • 它又是一种对 9 的自补码,即某数的 2421 码,只要自身按位取反,就能得到该数对 9 补数的 2421 码。例如:3 的 2421 码是 0011,3 对 9 的补数是 6,而 6 的 2421 码是 1100,即将 3 的 2421 码自身按位取反可得到 6 的 2421 码。在十进制运算中,采用自补码,可以使运算器线路简化。
  • 不允许出现 0101~1010。这 6 个代码在 2421 码中是非法码。

对于有权码来说,当规定各位的权不同时,可以有多种不同的编码方案,例如还有 4221 码、4421 码、5421 码和 84-2-1 码等。

  • 余 3 码

余 3 码是一种无权码,从表 2-7 中可以看出,余 3 码是在 8421 码的基础上加 0011 形成的,因每个数都余 3,故称余 3 码,其主要特点是:

  • 它是一种无权码,在这种编码中各位的“1”不表示一个固定的十进制数值,因而不直观,且容易搞错。

  • 它也是一种对 9 的自补码。

  • 不允许出现 0000~0010,1101~1111。这 6 个代码在余 3 码中是非法码。

  • 格雷码(Gray 码)

十进制 Gray 码的方案有很多种,表 2-7 中列出的只是其中的一种。Gray 码可以避免在计数时发生中间错误,所以也被称为可靠性编码。其主要特点是:

  • 它也是一种无权码。
  • 从一种代码变到相邻的下一种代码时,只有一个二进制位的状态在发生变化。
  • 具有循环特性,即首尾两个数的 Gray 码也只有一个二进制位不同,因此 Gray 码又称为循环码。
  • 十进制 Gray 码也有 6 个代码为非法码,视具体方案而定。

参考文章

二进制/八进制/十进制/十六进制 怎么学会?

wikipedia --- 手指二进制

进制(二进制、十进制、八进制、十六进制)

拓展阅读摘自教材【计算机组成原理/蒋本珊编著.一 3 版.一北京:清华大学出版社,2013.8】

版权声明


  • 本文为原创文章,版权归本博客所有,转载请注明出处!
  • 原文链接:https://www.betterman.xyz/183.html
  • 所有原创文章采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
  • 我的个人博客:青衫不是山 https://www.betterman.xyz
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值