【C语言】揭开计数制的面纱:深入浅出二进制及二进制计算

  欢迎来到 CILMY23 的博客

🏆本篇主题为:揭开计数制的面纱:深入浅出二进制及二进制计算

🏆个人主页:CILMY23-CSDN博客

🏆系列专栏:Python | C++ | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算法专题 | 代码训练营

🏆感谢观看,支持的可以给个一键三连,点赞收藏+评论。如果你觉得有帮助,还可以点点关注


 本文前言

在C语言中,我们经常会对内存进行研究,其中不乏包括数据的存储,那最原始的数据还是要到二进制数,这就不得不补充一下我们的基础了,本篇博客主要补充数据存储篇(前篇:链接)中的各种计数制,包括二进制数,八进制数,十六进制数,十进制数,以及他们之间的相互转换,外加二进制数的四则运算。


 一、生活中的计数制 

 在生活中,任何一个数通常都可以用两种不同的方法表示,一种是按“值”表示法,即选定某种进位的计数体制来表示某个数值,这就是计数制,简称数制

1.1 十进制 

比如:

如果我们采用十进位计数制(简称:十进制,Decimal),它有10个数码,分别是0~9,当任何一位数比9大的时候,我们就会进位,原本的位就会从0开始计数,也是被称为“逢十进一”,

任何一个十进制数都可以用其幂的形式表示:

 我们把这种情况也叫“按权展开”,显然通过这种展开,我们能很快发现一个规律,那就是小数点前的数字,只要按对应的数字*对应的幂就好了,十进位就是*10^(n-1),小数点后是10^(-n),这样全部加在一块,就构成一个十进制数了。

任何一个十进制数都可以表示成以下形式:

只不过我们一般写成右下角为D的形式:

其中,n,m为正整数,Ki为系数,是十进制10个数码中的某一个,10是进位基数,10^i是位权,所以我们通常计算的时候是按权展开

1.2 二进制 

如果我们采用二进位计数制(简称:二进制,binary,它有2个数码,分别是0,1,当任何一位数比1大的时候,我们就会进位,原本的位就会从0开始计数,也是被称为“逢二进一”,

 在计算机存储中,我们通常采用二进制,一个字节有八个比特位,也就是八个二进制位,每一位存放一个二进制数,用0,1表示

二进制存储表示:

每一个二进制数都可以按权展开转换成十进制数:

我们通常也写成B在右下角

式中,Ki为系数;2为进位基数;2^i是二进制数的位权,二进制数不同位数的位权分别为2^(n-1),……,2^0,……2^-10”。任意1个二进制数按位权展开,都可转换为十进制数这种转换方法称为多项式替代法

 1.3 十六进制

 如果我们采用十六进位计数制(简称:十六进制,hexadecimal,它有16个数码,分别是0~9A~F,当任何一位数比15大的时候,我们就会进位,原本的位就会从0开始计数,也是被称为“逢十六进一”,

任何一个十六进制的数都可以用幂的形式表示:

 十六进制和二进制的关系:

由于十六进制是16 = 2 ^ 4 ,所以每一个十六进制数就可以看作四个二进制数,这就是直接转换法。如果有不够四位的,就补0.

二、进制之间的相互转换

我们将通过这些题来了解二进制,十六进制,十进制是如何转换的。 

2.1 十进制转换成二进制 

29.625 的转换 

解析如下:整数部分我们用除法,一直除以2,直到除到0或1为止 ,小数部分我们用乘法,每次乘一个2,取整数部分。

 
127.0625 的转换  

按照同样的方法我们也可以写出127的整数部分,0111 1111,0.0625,小数部分: 0.0625 * 2 = 0.125 取整数部分 0,所以小数部分为: 0
综合起来,127.0625 的二进制数为: 1111111.0

2.2 二进制数转换成十进制数

(1) 101101.11010111

 整数部分:

1\cdot 2^5 +0\cdot 2^4 +1\cdot 2^3 +1\cdot 2^2 +0\cdot 2^1 +1\cdot 2^0 

= 32 + 0 + 8 + 4 + 0 + 1 = 45
小数部分:

1\cdot 2^{-1} + 1\cdot 2^{-2} + 0\cdot 2^{-3} + 1\cdot 2^{-4} + 0\cdot 2^{-5} + 1\cdot 2^{-6}+1\cdot 2^{-7}+1\cdot 2^{-8}

 = 0.5 + 0.25 + 0 + 0.0625 + 0 + 0.015625 + 0.0078125 + 0.00390625= 0.83984375

综合起来,101101.11010111 的十进制数为: 45.83984375

(2)101011.101101

 整数部分:

1\cdot 2^5 +0\cdot 2^4 +1\cdot 2^3 +0\cdot 2^2 +1\cdot 2^1 +1\cdot 2^0 

=  32 + 0 + 8 + 0 + 2 + 1 = 43
小数部分:

1\cdot 2^{-1} + 0\cdot 2^{-2} + 1\cdot 2^{-3} + 1\cdot 2^{-4} + 0\cdot 2^{-5} + 1\cdot 2^{-6}

= 0.5 + 0 + 0.125 + 0.0625 + 0 + 0.015625 = 0.703125
综合起来,101011.101101 的十进制数为: 43.703125

我们对于二进制转换成十进制数的方法是按权展开

  1. 将二进制数分成整数部分和小数部分。
  2. 对于整数部分,从右到左依次乘以 2 的幂次,然后相加得到十进制整数部分。
  3. 对于小数部分,从左到右依次除以 2 的幂次,然后相加得到十进制小数部分。
  4. 将整数部分和小数部分相加,得到最终的十进制数。

2.3 二进制转换成十六进制

(1)100110.100111

整数部分: 

因为四位二进制可以直接看作一个十六进制数,所以我们可以划分一下,不够的补0.

所以整数部分就可以写成26 
小数部分: 1001 = 9,1100 = C
综合起来,100110.100111 的十六进制数为: 26.9C

 (2) 101011101.1100111

 整数部分: 0001,0101,1101 =1,5,D
小数部分:  1100,1110 = C,E
综合起来,101011101.1100111 的十六进制数为: 15D.CE

 二进制和十六进制的转换是可以跳过中间这个十进制的过程的,这样可以简便我们的过程,如果我们在二进制换八进制的情况下,除了借用这个计算器啊以外,我们可以直接转成十进制,然后再转成八进制。

2.4 十六进制转换成二进制

(1) 3AD.6EB

整数部分: 3 = 0011, A = 1010, D = 1101

小数部分: 6 = 0110, E = 1110, B = 1011

综合起来,3AD.6EB 的二进制数为: 0011 1010 1101.0110 1110 1011

(2)6C2B.4A7

整数部分: 6 = 0110, C = 1100, 2 = 0010, B = 1011

小数部分: 4 = 0100, A = 1010, 7 = 0111

综合起来,6C2B.4A7 的二进制数为: 0110 1100 0010 1011.0100 1010 0111


总结: 

无论是对于二进制,八进制,十六进制,我们都可以先统一转换成十进制,然后再转换成对应的进制数,除此之外,二进制也可以直接转换成十六进制,或者八进制(3个二进制一组),从效率上来讲,第二种方式快捷的多,好了,本期的进制就到这,我们下期见。


 🛎️感谢各位同伴的支持,本期计数制专题就讲解到这啦,如果你觉得写的不错的话,可以给个一键三连,点赞,收藏+评论,可以的话还希望点点关注,若有不足,欢迎各位在评论区讨论。       

部分内容参考书ISBN:978-7-111-52647-6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值