zoukankan      html  css  js  c++  java
  • 一个小公式帮你轻松将IP地址从10进制转到2进制

    网络工程师经常会遇到的一个职业问题:如何分配IP,通过子网如何捕捉某一网段或某台机器?他们甚至能够进行精准的分析和复杂的开发......凡此种种,其实与一些他们头脑中根深蒂固的常识性理论存有某种内在的本质关系。本文通过介绍一个IP地址10进制数转2进制的小公式,试图说明这样一个看似平淡无奇的小问题在地址分配和子网划分中却那么耐人寻味。本文着重介绍这个小公式。

    我们知道,IP是由四段数字组成,有3类常用的IP是:

    A类IP段  0.0.0.0 到127.255.255.255

    B类IP段  128.0.0.0 到191.255.255.255

    C类IP段  192.0.0.0 到223.255.255.255

    XP默认分配的子网掩码每段只有255或0,此即意味着:

    A类的默认子网掩码 255.0.0.0 一个子网最多可以容纳1677万多台电脑

    B类的默认子网掩码 255.255.0.0一个子网最多可以容纳6万台电脑

    C类的默认子网掩码 255.255.255.0 一个子网最多可以容纳254台电脑

    也许有人会认为,属于同一网段的电脑,只要IP的前三段一样就可以了,这犯了一个想当然的错误。如果是这样,一个子网就只能容纳254台电脑?真是笑话。我们来说详细看看吧。其实,同一网段,指的是具有相同的网络标识,为此首先要做的是把每段的IP转换为二进制!

    当把子网掩码切换至二进制,就会发现,所有的子网掩码是由一串连续的1和一串连续的0组成的(一共4段,每段8位,一共32位数)。比如,以下是A/B/C三类默认子网掩码的二进制形式:

    255.0.0.0 11111111.00000000.00000000.00000000

    255.255.0.011111111.11111111.00000000.00000000

    255.255.255.0 11111111.11111111.11111111.00000000

    其实,还有好多种子网掩码,只要是一串连续的1和一串连续的0就可以了(每段都是8位)。如11111111.11111111.11111000.00000000,这也是一段合法的子网掩码。子网掩码决定的是一个子网的计算机数目,计算机公式是2的m次方,其中,我们可以把m看到是后面的多少颗0。如255.255.255.0转换成二进制,那就是11111111.11111111.11111111.00000000,后面有8颗0,那m就是8,255.255.255.0这个子网掩码可以容纳2的8次方(台)电脑,也就是256台,但是有两个IP是不能用的,那就是最后一段不能为0和255,减去这两台,就是254台。

    以下就来介绍这个将IP地址10进制数转2进制的小公式。

    首先,我们列出一行表格,填写8个数字,看下表:

     128  64  32  16  8  4  2  1

    2. 这行数字的特点是:从右端数从1开始,由右到左每个数是前一个数的2倍,共运算7次,相当于一个比率为2的等比数列,我们的问题是,对于这8个数,如何给出对应的一个2进制数? 我们在进行IP地址转换时次序正相反,是由左向右的;对于IP地址中的每个数值,将与一个特定的10进制数进行比较,如果大于或等于这个特定数,就在下行空格内设置为0,否则就设置为1。

    3. 这里看一个具体的IP地址: 154.31.16.13 , 它的开始值为154;现问:它能够提取出128吗?回答YES,所以128对应的是1,如下表所示:

    a.

     128  64  32  16  8  4  2  1
     1              

    b. 现在计算新的比较数,等于26(154-128=26),现问:它能够提取出64吗?回答NO,所以64对应的是0,如下表:

     128  64  32  16  8  4  2  1
     1  0            

    c. 再问:从26可以提取32吗?回答NO,所以32对应的是0,如下表:

     128  64  32  16  8  4  2  1
     1  0  0          

    d. 再问:从26可以提取16吗?回答YES,所以16对应的是1,如下表:

     128  64  32  16  8  4  2  1
     1  0  0  1        

    h. 再生成一个新的比较数,是10 (26-16=10),问:从10可以提取8吗?回答YES,所以8对应的是1,如下表:

     128  64  32  16  8  4  2  1
     1  0  0  1  1      

    i. 再生成一个新的比较数:2 (10-8=2),问:从2可以提取4吗?回答NO,所以4对应的是0,如下表:

     128  64  32  16  8  4  2  1
     1  0  0  1  1  0    

    j. 再问:从2可以提取2吗?回答YES,所以2对应的是1,如下表:

     128  64  32  16  8  4  2  1
     1  0  0  1  1  0  1  

    k. 再生成一个新的比较数,是0 (2-2=0),所以对于最后一个数1

    所对应的只能是0,如下表:

     128  64  32  16  8  4  2  1
     1  0  0  1  1  0  1  0

    l. 这样,我们就得到154的2进制数为10011010 , 我们可以这样验算

    一下:就是将所有分配为1的表格数进行相加:128+16+8+2=154

    4. 再看例举的IP地址的第二个数是: 31,所以我们重复上述算法:

    m. 现问:从31中能够提取出128吗?回答NO,所以有下表:

     128  64  32  16  8  4  2  1
     0              

    n. 从31中能够提取出64吗?

     128  64  32  16  8  4  2  1
     0  0            

    o. 从31中能够提取出32吗?

     128  64  32  16  8  4  2  1
     0  0  0          

    p. 从31中能够提取出16吗?

     128  64  32  16  8  4  2  1
     0  0  0  1        

    q. 从15中能够提取出8吗?

     128  64  32  16  8  4  2  1
     0  0  0  1  1      

    r. 从7能够提取出4吗?

     128  64  32  16  8  4  2  1
     0  0  0  1  1  1    

    s. 从3能够提取出2吗?

     128  64  32  16  8  4  2  1
     0  0  0  1  1  1  1  

    t. 从1能够提取出1吗?

     128  64  32  16  8  4  2  1
     0  0  0  1  1  1  1  1

    u. 所以,31转为2进制格式就是 00011111,验算一下就是:

    16+8+4+2+1=31

    5. 下一个数是16,采用同样的算法就得到:

     128  64  32  16  8  4  2  1
     1              

    所以16的二进制格式为00010000。

    6 下一个数13,得到的表格为:

     128  64  32  16  8  4  2  1
     0  0  0  0  1  1  0  1

    所以13的二进制格式为00001101,验算算式为:8+4+1=13

    这样我们就得到IP为154.31.16.13 的二进制格式:

    10011010.00011111.00010000.00001101

    我们可以换一个角度说明上述公式的实用性,例如·:一个公司有530台电脑,组成一个对等局域网,子网掩码设多少最合适?

    530台电脑用B类IP最合适(A类不用说了,太多,C类又不够,肯定是B类),但是B类默认的子网掩码是255.255.0.0,可以容纳6万台电脑,显然不太合适,那子网掩码设多少合适呢?我们先来列个公式:

    2的n次方=560

    首先,我们确定2一定是大于8次方的,因为我们知道2的8次方是256,也就是C类IP的最大容纳电脑的数目,我们从9次方一个一个试2的9次方是512,不到560,2的10次方是1024,看来2的10次方最合适了。子网掩码一共由32位组成,已确定后面10位是0了,那前面的22位就是1,最合适的子网掩码就是:11111111.11111111.11111100.00000000,转换成10进制,那就是255.255.252.0。

  • 相关阅读:
    heat模板
    Leetcode812.Largest Triangle Area最大三角形面积
    Leetcode812.Largest Triangle Area最大三角形面积
    Leetcode811.Subdomain Visit Count子域名访问计数
    Leetcode811.Subdomain Visit Count子域名访问计数
    Leetcode806.Number of Lines To Write String写字符串需要的行数
    Leetcode806.Number of Lines To Write String写字符串需要的行数
    Leetcode819.Most Common Word最常见的单词
    Leetcode819.Most Common Word最常见的单词
    Leetcode783.Minimum Distance Between BST Nodes二叉搜索树结点最小距离
  • 原文地址:https://www.cnblogs.com/croot/p/3496188.html
Copyright © 2011-2022 走看看