图片[1]yxqz常用的进制换算yxqz小余塘

 

作者:余小小

日期:2021-10-02

 

进制的换算

也就是对常见的几种进制类型进行相互转换,从数学的角度来看。

c会将所有的信息,最终转成二进制,让计算机执行。

所有的进制数值都是在正数操作,负数操作的后面在提。

B和b

Byte,字节。字节跳动

bit(binary digit),比特。

一个大B= 8b,在计算机内存里的bit和bite的关系,我习惯把Byte叫做大B,bit叫做小b。

这里规定了一个单位法则一个B=8b,也就是说1字节=8位.为啥是8位,可能是我们喜欢8这个数字吧,当然计算机的存储有它的道理,就不深入了。

之前在基本数据类型中提到过的int占用4个字节,short占用2个字节,long占用4个字节说的就是Byte。

在c里一个数字、字母、标点符号各占一字节,一个汉字占两个字节。

关于一些内存单位的换算:

  • 1KB=1024B, 1MB=1024KB

  • 1GB=1024MB,1TB= 1024GB

  • 1PB= 1024TB, 1ZB = 1024PB

十进制转二进制(重要)

在c中,因为printf函数无法输入二进制的数,所以无法直观的看见二进制样子,那么只有通过数学上的换算来看了。

我这里全程用数学上的逻辑来分析转换的整个过程。

原始粗暴的方式,方式一:

二进制由01构成,且这里总共2位数字

  1. 首先,我们拿到一个十进制的数,比如22,按照中学数学中的方式,要转成啥进制,就除啥。

  2. 我要转成二进制,那么就疯狂除以2,一直到<=1为止。

  3. 记录所有的余数(0,1,1,0,1

  4. 所谓的一直到<=1为止,就是剩下的无法进行除法了,就直接写下来,就不进行运算了。比如最后剩下的1.

  5. 将所有的余数倒过来:10110(为啥要倒过来?)你想想,二进制最小在右边,而十机制最小在左边,然后呢?你说该不该换

  6. 则1010就是22的二进制表达式

  7. 那么,在计算机中,为了凑成8位,所以需要添加0来凑数,则完整点写法就是00010110,当然,考试或者测验,能到10110就够了。

可以参考:二进制如何转十进制,十进制如何转二进制-百度经验 (baidu.com)

优雅一点的方式,方式二:

在计算机中,最喜欢的就是1024,也就是2的10次方,那么,从数学角度分析,二进制在换算的时候,其实就是按照2的多少次方然后进行汇总。因为二进制吧,底数始终都是2,所以就可以从这个规律入手。

  1. 先在小本本上列出0,2,4,8,16,32,64,128.256,512,1024(分别从0开始,2的1次方,2的2次方,一直到2的10次方)

  2. 在这里的这些数字,都是代表的字节大小。而不是比特哈,这里是大B。方式一操作才是小b

  3. 简单的翻译一下数字,将B翻译成小b

  4. 0=00000000,2=00000010,3=00000011,4=000000100,这个3,是我后面加的,虽然列出的数字中没有,但是为了清晰

  5. 这里就有一个规律了:奇数转换成二进制,最右边是1,如果是偶数,则是0;

  6. 那么换算22这个数.由上面小本本写的几个数能构成的最简单加法式子写法是:2,4,16,当然你不要加个0说0+2+4+16,你也不要说用32-16+2+4+0,这种脱了裤子放屁的事情就不要做了。这里只考虑纯加法不看0

  7. 所以呢?我们在2和4和16的下面写上1啊。其他没用到的就是0,那么就是:011010000000

  8. 但是这里超过了8个数字,那你有8个数字了后面的就不要了呗,所以就是01101000

  9. 当然这里也需要倒过来才是正确答案即00010110,

好的知道了为啥小本本上要写这么多,你管三七二十一,你直接写了再说,反正写到512左右就OK,因为考试不会考多大的数字。

综上所述,如果10进制转换成二进制,如果十进制是偶数,用方法二,如果是奇数则用方法一

上机操作,方式三

#include <stdio.h>
#include <stdlib.h>
​
int main()
{
   char b[100];
   itoa(22,b,2);
   printf("22转成二进制:%s",b);
}

 

  • 引入#include <stdlib.h>

  • 使用itoa函数进行转换

  • 只能使用字符串输出

image-20210928165546618

总结十进制换算其他进制步骤

这里测试是十进制换二进制,如果是换8进制,则方法雷同

这个方法只限于其他进制是小于10之内能,比如转16进制就不行了

  1. 看数的奇偶,奇数直接开除2,偶数用小本本写下来,然后寻找最优加法

  2. 将所得结果凑8位,然后反写

二进制转十进制(重要)

在c中,二进制转十进制是很方便的,甚至是可以直接定义相关的变量,也就是说,可以直接使用

但是没必要直接写二进制的数值,因为我看不懂。

这里需要明白,二进制的写法,一大B= 8小b,用0凑成8个小b

在c中二进制的前缀是0b或者0B,否则定义就是一个十进制

原始粗暴的方式,方式一

去掉二进制前缀,也就是不看二进制的前缀

既然和2有关,那么,直接把2作为底数,然后从右边开始,第1位是2的0次方,第二位是2 的1次方,第三位是2的2次方然后加起来就OK,

高中说过的。例如00001111转成十进制=1×2的0次方+1×2的1次方+1×2的2次方+1×2的3次方=1+2+4+8=15

如果给个111当然自己要知道前面是有5个0的即00000111;然后同理可得1+2+4=7

如果写成0b或者0B111要明白哦,这个也是二进制。二进制的前缀就是0b或者0B

上机操作,方式二

这个和二进制数值的数类型有关,一般默认都是int类型,所以用%d来占位

十进制占位符:(全部是小写字母)

  1. %hd:对应short

  2. %d:对应int

  3. %ld:对应long

#include <stdio.h>
​
int main()
{
   printf("111转成十进制:%d",0B111);
}
​

 

image-20210928171242826

十进制转八进制(重要)

原始粗暴的方式,方式一

二进制由0,1,2,3,4,5,6,7构成,且这里总共8位数字

  1. 首先,我们拿到一个十进制的数,比如22,按照中学数学中的方式,要转成啥进制,就除啥。

  2. 我要转成二进制,那么就疯狂除以8,一直到<=7为止。

  3. 记录所有的余数 62

  4. 所谓一直到<=7为止,就是剩下的无法进行除法了,就直接写下来,就不进行运算了。比如最后剩下的2.

  5. 将所有的余数倒过来:26(为啥要倒过来?)你想想,二进制最小在右边,而十机制最小在左边,然后呢?你说该不该换

  6. 添加前缀0,即026,前缀是数字0

考试的时候,如果严格要求格式,不要忘记了前缀

上机操作,方式二

这个和二进制数值的数类型有关,一般默认都是int类型,所以用%o来占位

八进制的占位符:(全部是小写字母)

  1. %ho:对应short

  2. %o:对应int

  3. %lo:对应long

#include <stdio.h>
​
int main()
{
   printf("十进制22转成八进制:%o",22);
}

 

image-20210928172514609

八进制转十进制(重要)

所以使用二进制转十进制的方式雷同操作

八进制的前缀,数字0

十进制没有前缀

原始粗暴的方式,方式一

去掉八进制前缀,也就是不看八进制的前缀

直接把8作为底数,然后从右边开始,第1位是8的0次方,第二位是8 的1次方,第三位是8的2次方然后加起来

比如之前测试的026,转成十进制后就是=6×8的0次方+2×8的1次方=6+16=22;

再来一个:033 = 3+24=27

上机操作,方式二

这个和八进制数值的数类型有关,一般默认都是int类型,所以用%d来占位

十进制占位符:(全部是小写字母)

  1. %hd:对应short

  2. %d:对应int

  3. %ld:对应long

#include <stdio.h>
​
int main()
{
   printf("八进制26转成十进制:%d",026);
}

 

image-20210928173233776

八进制转二进制

不能直接除

原始粗暴的方式,方式一

学了八进制转十进制且简单和十进制转二进制的方式多样性,为了不增加大脑负担,可以分两部转换

  1. 将八进制数先转十进制

  2. 然后再将十进制转成二进制

其他方式参考:二进制如何转换成八进制,八进制如何转成二进制-百度经验 (baidu.com)

反正我懒得记忆了

上机操作,方式二

#include <stdio.h>
#include <stdlib.h>
​
int main()
{
   char b[100];
   itoa(026,b,2);
   printf("八进制26转成二进制:%s\n",b);
}

 

image-20210928175534789

二进制转八进制

原始粗暴的方式,方式一

学了二进制转十进制且简单和十进制转八进制,为了不增加大脑负担,可以分两部转换

  1. 将二进制转十进制

  2. 然后再将十进制转成八制

其他方式参考:二进制如何转换成八进制,八进制如何转成二进制-百度经验 (baidu.com)

上机操作,方式二

这个和二进制数值的数类型有关,一般默认都是int类型,所以用%o来占位

八进制的占位符:(全部是小写字母)

  1. %ho:对应short

  2. %o:对应int

  3. %lo:对应long

#include <stdio.h>
int main()
{
   printf("二进制转八进制:%o\n",0B10110);
}

 

image-20210928175842690

十进制转十六进制

十六进制的前缀很重要,0x,数字零和字母x

原始粗暴的方式,方式一

十六进制的组成,用数字0、1、2、3、4、5、6、7、8、9和字母A、B、C、D、E、F(a、b、c、d、e、f)表示,其中:A~F表示10~15,这些称作十六进制数字

  1. 首先,我们拿到一个十进制的数,比如22,按照中学数学中的方式,要转成啥进制,就除啥。

  2. 我要转成十六进制,那么就疯狂除以16,一直到<=15为止。

  3. 记录所有的余数(6,1)

  4. 所谓的一直到<=15为止,就是剩下的无法进行除法了,就直接写下来,就不进行运算了。比如最后剩下的1.

  5. 将所有的余数倒过来:16,不要忘记了前缀,所以就是0x16

上机操作,方式二

十六进制由数字 0~9、字母 A~F 或 a~f(不区分大小写)组成,使用时必须以0x0X(不区分大小写)开头,是数字0和字母x

这个和十六进制的数类型有关,一般默认都是int类型,所以用%x来占位

十六进制占位符:

  1. %hx 或者 %hX:对应short

  2. %x 或者 %X:对应int

  3. %lx 或者 %lX:对应long

#include <stdio.h>
int main()
{
   printf("十进制22转十六进制:%x\n",22);
}

 

这里编译器省略了前缀:0x

image-20210928184903442

十六进制转十进制

和二进制转十进制类似,和八进制转十进制类似

原始粗暴的方式,方式一

所有的其他进制直接转十进制的时候,需要从右边开始看

例如我这里有个十六进制的数0x1245需要转换成十进制,所以呢?

右到左5×16的0次方+4×16的1次方+2×16的2次方+1×16的3次方=5+64+512+4096=4677

如果是0xF4呢

则是4×16的0次方+Fx16的1次方,这里的F则是15因为是0到15嘛,用的英文字母表示的而已啦

所以是4+240=244

如果是0x16呢,则0x16=6×1+1×16=22

上机操作,方式二

这个和十六进制数值的数类型有关,一般默认都是int类型,所以用%d来占位

十进制占位符:(全部是小写字母)

  1. %hd:对应short

  2. %d:对应int

  3. %ld:对应long

#include <stdio.h>
int main()
{
   printf("十六进制0xF4转十进制:%d\n",0xF4);
}

 

文章版权声明 1、本网站名称:小余塘
2、本站永久网址:https://www.yxqz.top/
3、本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长QQ2457431511进行删除处理。
4、本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
6、本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容