admin 管理员组

文章数量: 887021

进制

前言: 二进制,回想起来还是当初刚学计算机导论的时候接触到的,貌似现在搞应用的cxy用的真的很少,也可能是我比较无知(滑稽),基本上都用C++,Java,Python等高级语言来开发程序,谁还用得到这个,它给我的第一感觉就是那些搞底层交互的程序该干的事儿,那闲话不多说了,今天就来讨论一下这个令人熟悉又陌生的知识吧。

那么介绍这么多了,什么是二进制呢?
 二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。

信息数据的存储单位:

  • 位(Bit)内存的最小单位
  • 字节(Byte)数据存储的最小单位1 Byte = 8 Bit
  • 千字节(KB):1 Kb = 1024 Byte
  • 兆字节(MB):1 Mb = 1024 Kb
  • 吉字节(GB):1 Gb = 1024 Mb
  • 太字节(TB): 1 Tb = 1024 Gb

关于“字节”和“位”,谁才是计算机中最小的单位呢?
  解释一:内存中一个Bit一个Bit的操作,而程序交互设计为了一个Byte一个Byte的操作,对我们这些程序员而言就byte吧。
  解释二:最小的存储单位是"位Bit",虽然一般程序语言中的数据类型最小单位为Byte,但是也通常提供”位运算“(C语言的教材里涉及了”位域“,虽然到现在我都不太懂)。
  总结:这些零碎的知识点网上的解释各种各样,事后大家可以在查查资料,推荐《计算机组成原理》。

信息数据的表示系统:

  •  二进制Bin  0~1组成
  •  八进制Oct  0~7组成
  •  十进制Dec  0~9组成
  •  十六进制Hex  0~F组成
  1. 二进制 → \rightarrow →十进制
      二进制转十进制可以通过多项式表示,以此类推,在这之后的“八进制”、“十六进制”同样如此,相信聪明的各位已经懂得举一反三了,就不再举例说明了。
      例:将二进制1011 转化为十进制表示
    1011(Bin)
      = 1* 2 3 2^3 23 + 0* 2 2 2^2 22 + 1* 2 1 2^1 21 + 1* 2 0 2^0 20
      = 8 + 0 + 2 + 1
      = 11(Dec)
      (其中2是基数,2的指数变化范围:0~ 2 B i t − 1 2^{Bit-1} 2Bit−1,Bit为二进制的位数)

  2. 十进制 → \rightarrow →二进制
      - 常规方式(除2求余,逆序排列)
     例:将十进制66 转化为二进制表示
       算式   商   余数
       66/2   33   0
       33/2   16   1
       16/2    8    0
       8/2      4    0
       4/2      2    0
       2/2      1    0
       1/2      0    1
       66(Dec)
       = 0100 0010(Bin)


      - 非常规方式(拆分数值,填补权值)
     例:将十进制82 转化为二进制表示
         82
      /        \
     64     18
      |         |
      2 6 {2^6} 26       2 4 + 2 1 {2^4 + 2^1} 24+21
    82(Dec)
     = 64 + 18
     = 2 6 {2^6} 26 + 2 4 + 2 1 {2^4 + 2^1} 24+21
     = 0101 0010(Bin)

  3. 十进制 → \rightarrow →八进制
      - 常规方式(除8求余,逆序排列)
     例:将十进制72 转化为八进制表示
       算式   商   余数
       72/8   9     0
       9/8     1     1
       1/8     0     1
       72(Dec)
       = 110(Oct)


      - 非常规方式(拆分数值,指数排列)
     例:将十进制102 转化为八进制表示
        102
      /        \
     64     38
      |         |
    1 ∗ 8 2 {1*8^2} 1∗82    4 ∗ 8 1 + 6 ∗ 8 0 {4*8^1 + 6*8^0} 4∗81+6∗80
    102(Dec)
     = 64 + 38
     = 8 2 {8^2} 82 + 4 ∗ 8 1 + 6 ∗ 8 0 {4*8^1 + 6*8^0} 4∗81+6∗80
     = 146(Oct)

  4. 十进制 → \rightarrow →十六进制
      - 常规方式(除16求余,逆序排列)
     例:将十进制96 转化为十六进制表示
       算式   商   余数
       96/16   6   0
       6/16     0   6
       96(Dec)
       = 60(Hex)


      - 非常规方式(拆分数值,指数排列)
     例:将十进制120 转化为十六进制表示
        120
      /        \
      112    8
      |         |
    7 ∗ 1 6 1 {7*16^1} 7∗161   8 ∗ 1 6 0 {8*16^0} 8∗160
    120(Dec)
     = 112 + 8
     = 7 ∗ 1 6 1 {7*16^1} 7∗161 + 8 ∗ 1 6 0 {8*16^0} 8∗160
     = 78(Hex)

  5. 二进制 → \rightarrow →八进制
     八进制最大的数字是7转换成二进制是111,刚好占3个位,每三个二进制数位为一组,转成一个八进制数位,如果二进制高位不足3位时,用零填补。
     例:将二进制1011001 转化为八进制表示
    1011001(Bin)
     = 001 011 001
     = 1  3  1(Oct)

  6. 二进制 → \rightarrow →十六进制
     十六进制最大的数字是F,即15转换成二进制是1111,刚好占4个位,每四个二进制数为一组,转成一个十六进制数位,如果二进制高位不足4位时,用零填补。
     例:将二进制1000111111 转化为十六进制表示
    1000111111(Bin)
     = 0010 0011 1111
     =  2   3    F(Hex)

  7. 八进制 → \rightarrow →二进制
     既然每三个二进制数位可以组成一个八进制数位,那反过来思考,不就是一个八进制位可以拆分为三个二进制数位嘛。
     例:将八进制161 转化为二进制表示
    161(Oct)
     = 001 110 001(Bin)

     这样是不是简单了不少呢,以前导论老师教我八进制 → \rightarrow →十进制 → \rightarrow →二进制,贼麻烦!!!

  8. 十六进制 → \rightarrow →二进制
     你八进制能省事,我十六进制也省。同理,每个十六进制数位拆分为四个二进制数位,直接上例子。
    66CCFF(Hex)
     =0110 0110 1100 1100 1111 1111(Bin)

  9. 各进制的用途
      聊了这么多,我都有些累了,要是没人看,就伤心透了。那么说了这么多,这些进制到底有什么用呢?
    二进制:毋庸置疑的0和1,像平常编写的Java,C程序,机器无法直接识别,只有把程序翻译成机器语言,才能告诉计算机你要干什么。
    八进制:不太清楚,这是我道听途说的,与Linux系统下的文件权限有关,感兴趣的同学可以研究一下。
    十进制:666,1,0…这熟悉的数字,你有没有一丝丝感触呢,日常生活中随处可见嘛,不多说了。
    十六进制:内存地址空间使用16进制数位表示,强大的IDE配上C语言,那简直无敌好嘛。

  10. 总结
     本人水平有限,文中若有什么不妥,欢迎指出,我写此篇博客只是自己在学习过程中的一个小总结,如果你觉得本文不错,帮我点个赞!!!学了这么长时间,不如看看老婆放松一下。

本文标签: 进制