您的位置:首页 > 其它

熟练掌握 Cisco 路由器配置的预备知识

2009-01-09 13:03 375 查看
[align=left]平时我们面对这一个一个的数字好像都麻木了.他们在我们眼里好像仅仅是一个数字而已,其实不然,他们有很多很多的含义,我们可以从一个数字里看出艺术来.[/align]
[align=left]如:0~7 我们可以把它看作10进制中的0~7也可以看做8进制或是16进制中的0~7,他们在不同的进制里有着不同的含义.又如:我们平时所说的0和1.他们既可 以表示数字0和1,也可以表示真和假.等等.其实我们所使用的2进制,8进制,16进制中也蕴含着很多的艺术.不过这些仅仅是一些规定而已,同样我们也可以规定4进制,5进制等。但我们须保证他有一定的意义和用途.好了,让我们一起来看看数字分析的艺术吧:[/align]
[align=left]十进制数[/align]
[align=left]我们来看一个数字:168,看见这个数字你会怎么看待它呢?会有多少种想法呢?呵呵.有的同学可能来了一个很响亮的回答:”一路发”。是啊,这也算一种理解。我们看看这个数字本身怎么理解:[/align]
[align=left]1 :[/align]
[align=left]168 = 1 * 100 + 6 * 10 + 8 * 1 这种理解方式是在十进制的基础上进行理解.这种方式有什么用途呢?我们可以把它用在求余或是求某位上。[/align]
[align=left]如:我们要求168的十位数字:[/align]
[align=left]int n;[/align]
[align=left]n =(168%100)/ 10;[/align]
[align=left]或[/align]
[align=left]n = (168 – 168 / 100 * 100) / 10;[/align]
[align=left]对下面这个解释一下:[/align]
[align=left]168 / 100 是求百位数字[/align]
[align=left]168 / 100 * 100求出整百[/align]
[align=left]168 – 168 / 100 * 100 求出最高位为十位的数字. 其实他等价于 168 % 100;[/align]
[align=left]2:[/align]
[align=left] 168 = ((1 * 10 + 6)*10)+ 8[/align]
[align=left] 这又是一种理解方法。这种理解方法我们是从高位开始进行分析的.打破了我们以前学习数学的习惯,但他有他的好处.如在库函数中有这样一个库函数atoi(char a[]);[/align]
[align=left]它的实现里就使用了这种分析方法:[/align]
[align=left]int n = 0;[/align]
[align=left]for (i = 0; s[i] >= ‘0’ && s[i] <= ‘9’; ++i)[/align]
[align=left]{[/align]
[align=left] n = n * 10 + s[i] – ‘0’;[/align]
[align=left]}[/align]
[align=left]是不是实现上很简单啊。我们若要使用第一种思考的方法,那么在实现上就麻烦许多了,至少你需要用到一个成方的函数.增大了开销.[/align]
[align=left]不过其实这个成方函数我们也可以不用的,我们看下面这种实现方法:[/align]
[align=left]int n,num;[/align]
[align=left]n = 0;[/align]
[align=left]num = 1;[/align]
[align=left]for (i = maxlen; s[i] > ‘0’ && s[i] < ‘9’; - -i)[/align]
[align=left]{[/align]
[align=left] if (i < maxlen)[/align]
[align=left] {[/align]
[align=left] num = num * 10;[/align]
[align=left]}[/align]
[align=left]n = n + (s[i] – ‘0’) * num;[/align]
[align=left]}[/align]
[align=left]max 表示代表数字字符串的长度.[/align]
[align=left]我们看以看出我们使用num代替了成方函数的调用.[/align]
[align=left]十六进制数:[/align]
[align=left]如:0X7F[/align]
[align=left]我们要把这个十六进制转换为十进制,同样有两种理解方法:[/align]
[align=left] 1:[/align]
[align=left] F * 1 + 7 * 16;[/align]
[align=left] 这里的1代表16的0次方.16代表16的1次方.这样我们就可以获得对应的十进制了.在学进制转换时,老师是这么讲的,很多参考书上也是这么说的.[/align]
[align=left] 2:[/align]
[align=left] 7 * 16 + F[/align]
[align=left]这个表达式好像和上面的那个相同只是位置变了下。非也非也.他们的理解方式不同,如果要用程序实现的话,代码也不同.为了更好的看清这种理解方式,我们在这里再举一个例子: 0X37AC,[/align]
[align=left]方式一:[/align]
[align=left]C * 1 + A * 16 + 7 * 16 * 16 + 3 * 16 * 16 *16[/align]
[align=left]方式二:[/align]
[align=left]((3*16 + 7)* 16 + A)* 16 + C.[/align]
[align=left]使用分配率对这个表达式化简一下,你会发现和方式一的表达式是一样的.但他们是由两种完全不同的理解方式得出的结果。[/align]
[align=left]其实这两种方式对应着我们的两种习惯,第一个是我们在数学上习惯从低位开始处理的习惯.第二个是我们在字符串上习惯从低位开始的习惯.具体使用 那种方式,那就要看看我们更习惯那种习惯了。呵呵…这两种方式在《The C Programming Language》一书中都得到了应用.[/align]
[align=left]我们不能说那个更有用,而是看你更习惯那一个了。[/align]
[align=left]对于二进制,八进制是和十六进制雷同的,这里就不在举例。[/align]
[align=left]有意义数子分析:[/align]
[align=left] 1.月份中的天数[/align]
[align=left] 我们都清楚每个月的天数是不同的.有3种情况:28,30,31[/align]
[align=left]一、三、五、七、八、十、腊月(十二月)是31天,四、六、九、十一月是30天,只有二月,平年28天,闰年29天。[/align]
[align=left]我们可以观察月份与对应的天数.发现其实找不到什么规律可言。但是如果我们要在程序中要知道那个月有多少天该怎么办呢?总不能每次都来一个switch循环或是一个大大的if结构把.很是麻烦.这里后我们就可以把月份对应的数字不在看成月份,而是看成数组的下标。所以我们就可以这么做了:[/align]
[align=left]int Month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};[/align]
[align=left]这样我们就可以很方便的在程序用引用一个月份有多少天了。如我们要知道11月份有多少天,我们可以这么做.a[11-1]就是对应的天数了,减一是因为数组下标是从0开始的.那么二月份怎么办呢?其实二月份我们单独拉出来就OK了,首先进行一个if判断,如果是闰年天数就为29,平年就为28.是不是很方便啊.呵呵…很多同学说你这叫啥数字分析的艺术啊?不就是用了一个数组进行存储嘛。否,我们这里没有仅仅将月份看成月份,我们把它和数组下标联系起来了,这就是一种艺术.[/align]
[align=left]2.十六进制数[/align]
[align=left] 我们都知道十六进制是有0~f这16个数字组成的,那么若是我们用到a~f对应的十进制数时该怎么办呢?并且a~f也可以有大写,他们是等价的.我们该如何处理这种情况呢?这个处理方法和上面的那个类似。[/align]
[align=left]char *p = “aAbBcCdDeEfF”;[/align]
[align=left]同样我们把他们存储起来,利用下标来解决问题。但是问题到此还不能解决,我们可以发现我们存储的时候既有大写又有小写,我们该怎样将他们与下标联系起来呢?好的,见证奇迹的时候到了:[/align]
[align=left]for (int i = 0; i < 12; ++i)[/align]
[align=left]{[/align]
[align=left] int num = 10 + i/2; //对应字符的数字.[/align]
[align=left]}[/align]
[align=left]我们可以看出虽然a和A存储的位置不同,但我们可以得到相同的结果.很COOL吧.这里我们用到了隐式类型转换即:[/align]
[align=left]1/2赋给一个整数时会发生隐式转换,结果为0.[/align]
[align=left]3/2----1[/align]
[align=left]5/2----2[/align]
[align=left]7/2----3[/align]
[align=left]9/2----4[/align]
[align=left]11/2---5[/align]
[align=left]看出来了吗?在这里面你是不是也看出了奇数和偶数其实在有些情况下也是等价的?如果没有的话,我们让它现身;[/align]
[align=left]int a = 4/2;[/align]
[align=left]int b = 5/2;[/align]
[align=left]现在a和b是不是相等?呵呵…学会用灵活的方法看待问题.我们会得到意想不到的结果.[/align]
[align=left]3. 二进制数字[/align]
[align=left]众所周知,二进制是由0和1组成的。至少稍微有点编程基础的朋友都知道0可以对应假,1可以对应真.更加广泛一点的说,所有的数字中非0就是真。我们在程序中会看到这样的用法:[/align]
[align=left] if (flag) if (!flag)[/align]
[align=left] { {[/align]
[align=left] … 或 …[/align]
[align=left] } } [/align]
[align=left]这里的flag并不一定就是一个bool类型的数字,它可以是一个int还可以是long,float,double.甚至还可以是数组,是指针.具体是什么,那就要看看我们的用途是什么了。要把思维扩展看来,不要局限于某一个地方,某一个规定.对于一个事物我们如过从不同的方面去看,或是不同的方式去思考它,那么他或许就会带给你奇迹.[/align]本文出自 “乘风破浪” 博客,请务必保留此出处http://ihome.blog.51cto.com/2033151/391557
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: