zoukankan      html  css  js  c++  java
  • 进制

      本文没有重点讲述进制转化的计算,因为这些在很容易查询到,而是重点讲述我怎么理解进制以及它们之间的转化。

    进制的理解

      假设有这么一个十进制数(12345_{10}),那么它可以分解为(12345=1 imes 10^4 + 2 imes 10^3 + 3 imes 10^2 + 4 imes 10^1 + 5 imes 10^0),也就是说数字1,2,3,4,5在每一位都有自己代表的不同的值,就好像4在十位,就表示(40_{10})
      接着我们引入"位值"的概念,即:同一个数字,放在不同的数位上,代表不同大小的“量”。例如:十进制中,百位上的1表示100,十位上的1表示10)。对于一个k进制的数(12345_{k}=1 imes k^4 + 2 imes k^3 + 3 imes k^2 + 4 imes k^1 + 5 imes k^0)

    进制转换

    2进制转10进制

      通过上面,我们已经知道,(1011_2=1 imes 2^3 + 0 imes 2^2 + 1 imes 2^1 + 1 imes 2^0),那么如何将(1011_2)转化位10进制呢,“位值”告诉我们每一位都有自己所代表的量,如何将这些量相加运算时是使用进制k,那么它得到的结果就是k进制。如(1011_2=1 imes 2^3 + 0 imes 2^2 + 1 imes 2^1 + 1 imes 2^0 = 8_{10} + 0_{10} + 2_{10} + 1_{10}=11_{10}),也就是说(1011_2)的十进制就是11。

    10进制转2进制

      接着我们将(11_{10})转化为二进制,但是有人就会说,(11_{10}=1 imes 10^1 + 1 imes 10^0),在运算中运用二进制去算太麻烦了,首先我得将10换为二进制,还要做乘法和加法。有没有更加简单的方法呢?
      答案肯定是有的。通过秦九韶公式我们都知道,(1011_2=1 imes 2^3 + 0 imes 2^2 + 1 imes 2^1 + 1 imes 2^0 = ((1 imes 2 + 0) imes 2 + 1) imes 2 + 1),如果设(1011_2 = k_{10}),那么由上面的秦九韶公式我们就可以知道(k div 2)的余数1恰好是(1011_2)中的最低位数,商为((1 imes 2 + 0) imes 2 + 1),如果不断用商除以2得到的余数便是(1011_2)上从低到高的每一位。这也是课本或者教科书上10进制转2进制的方法的原理。
      通过这个原理,我们也可以就是10进制数(含小数)转化为2进制的原理。现在我们将(11.46_{10})转化为2进制数。通过前面我们都已经知道(11.46_{10})的整数部分(11_{10}=1011_2),所以我们只需要考虑小数部分。我们先类比一下“位置”,(1.23_{10} = 1 imes 10^0 + 2 imes 10^{-1} + 3 imes 10^{-2}),那么(0.101_2=0 imes 2^0 + 1 imes 2^{-1} + 0 imes 2^{-2} + 1 imes 2^{-3})。所以我们可以假设(0.46_{(10)}=0.a_1a_2...a_{n_{(2)}}=a_1 imes 2^{-1} + a_2 imes 2^{-2}+...+a_n imes 2^{-n}),同样,0.46除以(2^{-1})(也就是0.46 × 2)得到的余数(得到的积,积≥1,取1,反之,取0)便是(a_1),而商(若积>1,将积-1作为下一个乘数)就是(a_2 imes 2^{-2}+...+a_n imes 2^{-n}),这样不断下去,就可以求出(11.46_{10})的二进制数。
      我们都知道计算机是用二进制来存放数据的,如果二进制数是无限小数,那么计算机也无法用有限的位数来存,这便是浮点数出现偏差的原因之一。

    2进制转16进制

      假设有这么一个8位的(11011100_2=1 imes 2^7 + 1 imes 2^6 + 0 imes 2^5 + 1 imes 2^4 + 1 imes 2^3 + 1 imes 2^2 + 0 imes 2^1 + 0 imes 2^0),它的十六进制数为(XY_{16} = X imes 16^1 + Y imes 16^0),我们都知道(16=2^4),因此,我们可以修改等式,(11011100_2=1 imes 2^7 + 1 imes 2^6 + 0 imes 2^5 + 1 imes 2^4 + 1 imes 2^3 + 1 imes 2^2 + 0 imes 2^1 + 0 imes 2^0 = (1 imes 2^3 + 1 imes 2^2 + 0 imes 2^1 + 1 imes 2^0) imes 16^1 + (1 imes 2^3 + 1 imes 2^2 + 0 imes 2^1 + 0 imes 2^0) imes 16^0),由于((1 imes 2^3 + 1 imes 2^2 + 0 imes 2^1 + 1 imes 2^0)_{16}=D_{16},(1 imes 2^3 + 1 imes 2^2 + 0 imes 2^1 + 0 imes 2^0)_2 = C_{16}),所以所求的数为DC。
      这也就是为什么2进制转化为16进制总是4个4个化为一组的原因。

    16进制转为2进制

      通过2进制转化为16进制,我们知道16进制每个位上的数对应着4个二进制的数,所以我们可以这样求DC的二进制数,由(D_{16}=13_{10}=1101_2)(C_{16}=12_{10}=1100_2),所以(DC_{16}=11011100_2)

  • 相关阅读:
    groovy main method is use static main(args) //ok
    undefined reference to
    CuTest: C Unit Testing Framework
    screen to tmux: A Humble Quickstart Guide « My Humble Corner
    main,tmain,winmain()等函数——UNICODE sensensen 博客园
    Adding Unit Tests to a C Project NetBeans IDE 6.9 Tutorial
    罗马转数字
    About Luvit
    KISSY Keep It Simple & Stupid, Short & Sweet, Slim & Sexy...
    Create a CSV file
  • 原文地址:https://www.cnblogs.com/h-hg/p/8495208.html
Copyright © 2011-2022 走看看