﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-储备站</title><link>http://www.blogjava.net/calvinlau/</link><description>技术储备，从这里开始</description><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 11:00:07 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 11:00:07 GMT</pubDate><ttl>60</ttl><item><title>zz 什么时候用GET？什么时候用POST？</title><link>http://www.blogjava.net/calvinlau/articles/298052.html</link><dc:creator>iConnect</dc:creator><author>iConnect</author><pubDate>Tue, 13 Oct 2009 05:09:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/298052.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/298052.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/298052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/298052.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/298052.html</trackback:ping><description><![CDATA[http://www.lupaworld.com/28135/viewspace_15443.html<br />
<br />
GET和POST两种方法都是将数据送到服务器，但你该用哪一种呢？<span style="display: none;">LUPA开源社区o!X%JCa/ue7{y</span><br />
HTTP标准包含这两种方法是为了达到不同的目的。POST用于创建资源，资源的内容会被编入HTTP请示的内容中。例如，处理订货表单、在数据库中加入新数据行等。<span style="display: none;">LUPA开源社区0B#Ed
g8k|}I</span><br />
当请求无副作用时（如进行搜索），便可使用GET方法；当请求有副作用时（如在数据库添加数据行），则用POST方法。一个比较实际的问题是：GET方法可能会产生很长的URL，或许会超过某些浏览器与服务器对URL长度的限制。<span style="display: none;">LUPA开源社区`_"a"SP9H</span><br />
若符合下列任一情况，则用POST方法：<br />
<span style="display: none;">vP[)E&amp;g!k"d0</span>
<ul>
    <li>请求的结果有持续性的副作用，例如，数据库内添加新的数据行。&nbsp; &nbsp;</li>
    <li>若使用GET方法，则表单上收集的数据可能让URL过长。&nbsp; &nbsp;</li>
    <li>要传送的数据不是采用7位的ASCII编码。</li>
</ul>
&nbsp; &nbsp; 若符合下列任一情况，则用GET方法： <span style="display: none;">LUPA开源社区NF3eX-^/_Bj</span><br />
&nbsp; &nbsp;
<ul>
    <li>请求是为了查找资源，HTML表单数据仅用来帮助搜索。&nbsp; &nbsp;</li>
    <li>请求结果无持续性的副作用。&nbsp; &nbsp;</li>
    <li>收集的数据及HTML表单内的输入字段名称的总长不超过1024个字符。</li>
</ul>
<img src ="http://www.blogjava.net/calvinlau/aggbug/298052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">iConnect</a> 2009-10-13 13:09 <a href="http://www.blogjava.net/calvinlau/articles/298052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zz finally的小特性</title><link>http://www.blogjava.net/calvinlau/articles/296745.html</link><dc:creator>iConnect</dc:creator><author>iConnect</author><pubDate>Mon, 28 Sep 2009 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/296745.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/296745.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/296745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/296745.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/296745.html</trackback:ping><description><![CDATA[<span style="font-size: large;">http://zangxt.javaeye.com/blog/421508<br />
<br />
try/catch/finally语句下，finally子句是肯定会执行的。但是很多人做不同的测试，却得出了不同的结论。</span>
<p><span style="font-size: large;">具体的原理最好是去看《深入java虚拟机》，里面对jsr、ret等几个指令做了详细的说明。这里不深入分析，而仅仅是从表现形式上看一下finally的特征。</span></p>
<p><span style="font-size: large;">代码：</span></p>
<p><span style="font-size: large;">&nbsp;&nbsp;
<pre name="code" class="java">/*<br />
* author: Zang XT<br />
*/<br />
<br />
public class TestFinal {<br />
public static void main(String[] args) {<br />
System.out.println("test1:" + testFinal1());<br />
System.out.println("test2:" + testFinal2());<br />
System.out.println("test3:" + testFinal3());<br />
System.out.println("test4:" + testFinal4());<br />
}<br />
<br />
static int testFinal1() {<br />
int i = 1;<br />
try {<br />
return i;<br />
} finally {<br />
System.out.println("in testFinal1():finally 肯定会被执行的！");<br />
i = 48;<br />
}<br />
}<br />
<br />
static String testFinal2() {<br />
String str = "try";<br />
try {<br />
return str;<br />
} finally {<br />
System.out.println("in testFinal2():finally 肯定会被执行的！");<br />
str = "finally";<br />
}<br />
}<br />
<br />
static StringBuilder testFinal3() {<br />
StringBuilder build = new StringBuilder("try ");<br />
try {<br />
return build;<br />
} finally {<br />
System.out.println("in testFinal3():finally 肯定会被执行的！");<br />
build.append("finally");<br />
build = new StringBuilder("你猜我是谁！");<br />
}<br />
}<br />
<br />
static String testFinal4() {<br />
try {<br />
return "return in try";<br />
} finally {<br />
System.out.println("in testFinal4():finally 肯定会被执行的！");<br />
return "return in finally";<br />
}<br />
}<br />
}<br />
<br />
</pre>
<font size="5">
<p>&nbsp;</p>
</font></span></p>
<p>&nbsp;</p>
<p><span style="font-size: large;">输出是：</span></p>
<p><span style="font-size: large;">in testFinal1():finally 肯定会被执行的！</span></p>
<p><span style="font-size: large;">test1:1</span></p>
<p><span style="font-size: large;">in testFinal2():finally 肯定会被执行的！</span></p>
<p><span style="font-size: large;">test2:try</span></p>
<p><span style="font-size: large;">in testFinal3():finally 肯定会被执行的！</span></p>
<p><span style="font-size: large;">test3:try finally</span></p>
<p><span style="font-size: large;">in testFinal4():finally 肯定会被执行的！</span></p>
<p><span style="font-size: large;">test4:return in finally</span></p>
<div><span style="font-size: large;">&nbsp;&nbsp;&nbsp;&nbsp;
结论很明显，finally的语句确实执行了，而且肯定是在方法return之前执行的，而且，如果finally中有return语句的话，方法直接结
束。这里需要注意的只有一点：在try中的return语句会将返回结果值压栈，然后转入到finally子过程，等到finally子过程执行完毕之后
（没有return），再返回。</span></div>
<div><span style="font-size: large;">下面具体看4个例子：</span></div>
<div><span style="font-size: large;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在testFinal1()中，return i;会将结果i的值，也就是1压入栈。即使在finally中将i修改了（i=48），也不回对已经压入栈里的1造成任何影响。</span></div>
<div><span style="font-size: large;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在testFinal2()中，return
str;将str的内容压入栈，比如我们假设str的内容为0x108(只是一个地址值),通过这个地址值我们能找到"try"，那栈里的内容就是
0x108。执行str =
"finally"，这时候str这个变量的内容可能变为0x237了，这是串"finally"的地址。方法调用结束后，返回的是什么？return时
压入栈里的0x108。所以在打印结果时，我们打印的是通过0x108找到的字符串"try"。</span></div>
<div><span style="font-size: large;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在testFinal3()中，return
压栈的是build这个变量的值，比如是0x3579，通过这个值我们可以找到StringBuilder对象。finally语句块中对这个对象的内容
进行了修改。build = new
StringBuilder("你猜我是谁！");让build变量指向了一个新的对象，这时候build的值可能是0x4579了。但是，别忘了，原来
的StringBuilder对象仍然在0x3579处，而我们压栈的正是0x3579啊！方法返回后，我们得到的返回值0x3579，通过这个引用值找
到相应的StringBuilder对象，所以打印的结果是test3:try finally。</span></div>
<div><span style="font-size: large;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在testFinal4()中，finally有return语句，直接返回，方法结束。</span></div>
<div><span style="font-size: large;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么不同的人有不同的结论？关键是没有正确理解压栈的是什么东西。其实初学java的时候，如果理解了变量是什么，并区分引用和对象本身就不会得到错误的结论了。再有，如果理解java中，方法调用都是采用传值模式的话，这里也就类似的可以明白了。</span></div>
<img src ="http://www.blogjava.net/calvinlau/aggbug/296745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">iConnect</a> 2009-09-28 11:09 <a href="http://www.blogjava.net/calvinlau/articles/296745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>整数转字符串</title><link>http://www.blogjava.net/calvinlau/articles/296554.html</link><dc:creator>iConnect</dc:creator><author>iConnect</author><pubDate>Sat, 26 Sep 2009 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/296554.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/296554.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/296554.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/296554.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/296554.html</trackback:ping><description><![CDATA[void IntToStr(int a,char* str){<br />
&nbsp;&nbsp;&nbsp; if(a==0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *str='0';<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *(str+1)='\0';<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; char* p = str;<br />
&nbsp;&nbsp;&nbsp; if(a&lt;0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; a=a*(-1);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *p++ = '-';<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; int len = 0;<br />
&nbsp;&nbsp;&nbsp; while(a){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *p++ = a%10+'0';<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; a/=10;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ++len;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; int start = *str=='-'?1:0;<br />
&nbsp;&nbsp;&nbsp; int tmp;<br />
&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;len/2;++i){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tmp = str[start+i];<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; str[start+i]=str[len+start-1-i];<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; str[len+start-1-i]=tmp;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; str[len+start]='\0';<br />
}<br />
void main(){<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; char* str = new char[12];<br />
&nbsp;&nbsp;&nbsp; //IntToStr(0,str);<br />
&nbsp;&nbsp;&nbsp; IntToStr(-12340,str);<br />
&nbsp;&nbsp;&nbsp; //IntToStr(214748367,str);<br />
&nbsp;&nbsp;&nbsp; printf("%s\n",str);<br />
}<br />
<img src ="http://www.blogjava.net/calvinlau/aggbug/296554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">iConnect</a> 2009-09-26 15:41 <a href="http://www.blogjava.net/calvinlau/articles/296554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>static全局变量与普通的全局变量有什么区别？static局部变量和普通局部变量有什么区别？static函数与普通函数有什么区别？</title><link>http://www.blogjava.net/calvinlau/articles/294233.html</link><dc:creator>iConnect</dc:creator><author>iConnect</author><pubDate>Mon, 07 Sep 2009 15:37:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/294233.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/294233.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/294233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/294233.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/294233.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Czhl%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles deflockedstate="false" latentstylecount="156">
</w:LatentStyles>
</xml><![endif]--><style>
<!-- /* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
<p class="MsoNormal"><strong><span style="font-size: 9pt; color: blue;" lang="EN-US">static</span></strong><strong><span style="font-size: 9pt; font-family: 宋体; color: blue;">全局变量与普通的全局变量有什么区别？</span></strong><strong><span style="font-size: 9pt; color: blue;" lang="EN-US">static</span></strong><strong><span style="font-size: 9pt; font-family: 宋体; color: blue;">局部变量和普通局部变量有什么区别？</span></strong><strong><span style="font-size: 9pt; color: blue;" lang="EN-US">static</span></strong><strong><span style="font-size: 9pt; font-family: 宋体; color: blue;">函数与普通函数有什么区别？</span></strong><strong><span style="font-size: 9pt; color: blue;" lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal"><span style="font-size: 9pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 宋体;">　　全局变量</span><span style="font-size: 9pt;" lang="EN-US">(</span><span style="font-size: 9pt; font-family: 宋体;">外部变量</span><span style="font-size: 9pt;" lang="EN-US">)</span><span style="font-size: 9pt; font-family: 宋体;">的说明之前再冠以</span><span style="font-size: 9pt;" lang="EN-US">static </span><span style="font-size: 9pt; font-family: 宋体;">就构成了静态的全局变量。全局变量本身就是静态存储方式，</span><span style="font-size: 9pt;"> </span><span style="font-size: 9pt; font-family: 宋体;">静态全局变量当然也是静态存储方式。</span><span style="font-size: 9pt;"> </span><span style="font-size: 9pt; font-family: 宋体;">这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序，</span><span style="font-size: 9pt;"> </span><span style="font-size: 9pt; font-family: 宋体;">当一个源程序由多个源文件组成时，非静态的全局变量在各个源文件中都是有效的。</span><span style="font-size: 9pt;"> </span><span style="font-size: 9pt; font-family: 宋体;">而静态全局变量则限制了其作用域，</span><span style="font-size: 9pt;"> </span><span style="font-size: 9pt; font-family: 宋体;">即只在定义该变量的源文件内有效，</span><span style="font-size: 9pt;"> </span><span style="font-size: 9pt; font-family: 宋体;">在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内，只能为该源文件内的函数公用，</span><span style="font-size: 9pt;"> </span><span style="font-size: 9pt; font-family: 宋体;">因此可以避免在其它源文件中引起错误。</span><span style="font-size: 9pt;" lang="EN-US"><o:p> <br />
</o:p></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 宋体;">　　从以上分析可以看出，</span><span style="font-size: 9pt;"> </span><span style="font-size: 9pt; font-family: 宋体;">把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域，</span><span style="font-size: 9pt;"> </span><span style="font-size: 9pt; font-family: 宋体;">限制了它的使用范围。</span><span style="font-size: 9pt;" lang="EN-US"><o:p> <br />
</o:p></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 宋体;">　　</span><span style="font-size: 9pt;" lang="EN-US">static</span><span style="font-size: 9pt; font-family: 宋体;">函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数</span><span style="font-size: 9pt;" lang="EN-US">(static)</span><span style="font-size: 9pt; font-family: 宋体;">，内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数，应该在一个头文件中说明，要使用这些函数的源文件要包含这个头文件</span><span style="font-size: 9pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 宋体;">　　</span><span style="font-size: 9pt;" lang="EN-US">static</span><span style="font-size: 9pt; font-family: 宋体;">全局变量与普通的全局变量有什么区别：</span><span style="font-size: 9pt;" lang="EN-US">static</span><span style="font-size: 9pt; font-family: 宋体;">全局变量只初使化一次，防止在其他文件单元中被引用</span><span style="font-size: 9pt;" lang="EN-US">;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 宋体;">　　</span><span style="font-size: 9pt;" lang="EN-US">static</span><span style="font-size: 9pt; font-family: 宋体;">局部变量和普通局部变量有什么区别：</span><span style="font-size: 9pt;" lang="EN-US">static</span><span style="font-size: 9pt; font-family: 宋体;">局部变量只被初始化一次，下一次依据上一次结果值；</span><span style="font-size: 9pt;" lang="EN-US"><o:p></o:p></span></p>
<span style="font-size: 9pt; font-family: 宋体;">　　</span><span style="font-size: 9pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">static</span><span style="font-size: 9pt; font-family: 宋体;">函数与普通函数有什么区别：</span><span style="font-size: 9pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">static</span><span style="font-size: 9pt; font-family: 宋体;">函数在内存中只有一份，普通函数在每个被调用中维持一份拷贝</span><span style="font-size: 9pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">. </span>
<img src ="http://www.blogjava.net/calvinlau/aggbug/294233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">iConnect</a> 2009-09-07 23:37 <a href="http://www.blogjava.net/calvinlau/articles/294233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(zz) Ubuntu inittab 小区别</title><link>http://www.blogjava.net/calvinlau/articles/289519.html</link><dc:creator>iConnect</dc:creator><author>iConnect</author><pubDate>Sun, 02 Aug 2009 16:44:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/289519.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/289519.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/289519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/289519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/289519.html</trackback:ping><description><![CDATA[<font style="background-color: #c7edcc">http://www.5dlinux.com/article/1/2008/linux_12543.html</font><br />
<br />
转到kubuntu之前曾经学习了一下，了解到ubuntu在6.10开始用upstart替代init，主要脚本都在/etc/event.d下面，默认情况下/etc下没有inittab文件。<br />
<br />
刚装上kubuntu时候专门到/etc/event.d下看了一下，特别注意到rc-default这个脚本，里面有一段内容:<br />
<br />
<br />
<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.cnweblog.com/images/cnweblog_com/skean/rc-default11.jpg" width="450" onload="return imgzoom(this,550)"  alt="" /><br />
<br />
说明默认情况下inittab虽然不存在，但是用户建立的inittab还是会被注意到的。<br />
<br />
然后又经别人的指点看了一下/usr/share/doc/upstart/下面的文档，其中README.Debian中有这么一段内容：<br />
<br />
这就给我这样一个印象，即虽然ubuntu用upstart替代init，但还是和init保持兼容。<br />
<br />
今天正好需要将系统直接启动到字符界面下，即不启动kdm。<br />
<br />
<br />
<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.cnweblog.com/images/cnweblog_com/skean/README-Debian11.jpg" width="450" onload="return imgzoom(this,550)"  alt="" /><br />
<br />
那就试试自建一个inittab文件，并按照以前的习惯写入一行id:3:initdefault: ，保存后重新启动，结果发现毫无变化，依然启动到桌面，有点纳闷，难道inittab不起作用？在终端里输入runlevel检查当前状态，显示 N 3，说明inittab有效果，那是什么原因呢？<br />
<br />
将刚才建立的inittab移除，将系统恢复到之前的状态并重新启动，再用runlevel检查，显示 N 2，说明ubuntu系统的default runlevel可能是2，这和我以前的常识有些冲突，看来又需要学习了。<br />
<br />
先去分别查看/etc/rc2.d至rc5.d下的内容，发现基本一致，都启动了kdm。这与其他的linux发行版不太一致，通常runlevel 3是Multi user mode，即直接登录到字符界面；而runlevel 5是Multi user mode with GUI，即登录到图形界面。<br />
<br />
后来在Debian的FAQ里面搜索到这样的内容：<br />
<br />
<br />
<br />
<img style="cursor: pointer" onclick="javascript:window.open(this.src);" src="http://www.cnweblog.com/images/cnweblog_com/skean/Debian-runlevel.jpg" width="502" onload="return imgzoom(this,550)"  alt="" /><br />
<br />
小区别就在这里了，看来debian以及衍生出来的发行版，如ubuntu的default runlevel确实是2，而且id 2至5都是一样的。<br />
<br />
真相大白，再次建立inittab，写入id:3:initdefault: ，然后进入/etc/rc3.d，将S13kdm移动到其他目录备份起来，重新启动系统，如愿以偿进入字符界面。
<img src ="http://www.blogjava.net/calvinlau/aggbug/289519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">iConnect</a> 2009-08-03 00:44 <a href="http://www.blogjava.net/calvinlau/articles/289519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（zz） x&amp;(x-1)表达式的意义</title><link>http://www.blogjava.net/calvinlau/articles/287331.html</link><dc:creator>iConnect</dc:creator><author>iConnect</author><pubDate>Sun, 19 Jul 2009 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/287331.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/287331.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/287331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/287331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/287331.html</trackback:ping><description><![CDATA[http://hi.baidu.com/zengzhaonong/blog/item/7fb884509ee30c61853524c2.html<br />
<br />
<strong>x&amp;(x-1)表达式的意义</strong><br />
<br />
<strong>求下面函数的返回值(微软) -- 统计1的个数</strong><br />
-------------------------------------<br />
int func(int x)<br />
{<br />
&nbsp;&nbsp;&nbsp; int countx = 0;<br />
&nbsp;&nbsp;&nbsp; while(x)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; countx++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = x&amp;(x-1);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return countx;<br />
}<br />
<br />
假定x = 9999<br />
10011100001111<br />
答案: 8<br />
<br />
思路: 将x转化为2进制，看含有的1的个数。<br />
注: 每执行一次x = x&amp;(x-1)，会将x用二进制表示时最右边的一个1变为0，因为x-1将会将该位(x用二进制表示时最右边的一个1)变为0。<br />
<br />
<br />
<br />
<br />
<strong>判断一个数(x)是否是2的n次方</strong><br />
-------------------------------------<br />
#include &lt;stdio.h&gt;<br />
<br />
int func(int x)<br />
{<br />
&nbsp;&nbsp;&nbsp; if( (x&amp;(x-1)) == 0 )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br />
&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />
}<br />
<br />
int main()<br />
{<br />
&nbsp;&nbsp;&nbsp; int x = 8;<br />
&nbsp;&nbsp;&nbsp; printf("%d\n", func(x));<br />
}<br />
<br />
<br />
注:<br />
(1) 如果一个数是2的n次方，那么这个数用二进制表示时其最高位为1，其余位为0。<br />
<br />
(2) == 优先级高于 &amp;<br />
<img src ="http://www.blogjava.net/calvinlau/aggbug/287331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">iConnect</a> 2009-07-19 15:27 <a href="http://www.blogjava.net/calvinlau/articles/287331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计算整数的二进制表示有多少个1</title><link>http://www.blogjava.net/calvinlau/articles/287327.html</link><dc:creator>iConnect</dc:creator><author>iConnect</author><pubDate>Sun, 19 Jul 2009 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/287327.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/287327.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/287327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/287327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/287327.html</trackback:ping><description><![CDATA[<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);"><br />
#include</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">stdio.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
#include</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">stdlib.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<br />
unsigned&nbsp;</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);">&nbsp;count_one(unsigned&nbsp;</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);">&nbsp;data)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);">&nbsp;count&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);">&nbsp;x&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;data;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(x)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;x&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;(x</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;count;<br />
}<br />
<br />
</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;main(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);">&nbsp;data[]&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;{</span><span style="color: rgb(0, 0, 0);">13</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">16</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">25</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">31</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">76</span><span style="color: rgb(0, 0, 0);">};<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;size&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">sizeof</span><span style="color: rgb(0, 0, 0);">(data)</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 255);">sizeof</span><span style="color: rgb(0, 0, 0);">(unsigned&nbsp;</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(i</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">size;i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">%d&nbsp;has&nbsp;%d&nbsp;1s\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,data[i],count_one(data[i]));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />
}<br />
</span></div>
<img src ="http://www.blogjava.net/calvinlau/aggbug/287327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">iConnect</a> 2009-07-19 14:38 <a href="http://www.blogjava.net/calvinlau/articles/287327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(zz)IP校验和详解</title><link>http://www.blogjava.net/calvinlau/articles/286494.html</link><dc:creator>iConnect</dc:creator><author>iConnect</author><pubDate>Sun, 12 Jul 2009 15:42:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/286494.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/286494.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/286494.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/286494.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/286494.html</trackback:ping><description><![CDATA[<strong><span style="font-size: 14pt; font-family: 宋体; color: blue;" lang="EN-US"><span>一、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span></strong><!--[endif]--><strong><span style="font-size: 14pt; font-family: 宋体; color: blue;">校验和算法<span lang="EN-US"><o:p></o:p></span></span></strong><span style="font-size: 12pt; font-family: 宋体;"><br />
</span>
<p class="MsoNormal" style="text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp; 之前一直只知道<span lang="EN-US">IP</span>校验和算法反码求和相关的<span lang="EN-US">,</span>但具体细节不清楚<span lang="EN-US">,</span>今天了解了下。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; IP</span><span style="font-size: 12pt; font-family: 宋体;">校验和主要是用来保证数据<span lang="EN-US">(IP</span>包头<span lang="EN-US">)</span>的完整性的<span lang="EN-US">.</span>它用的算法非常简单<span lang="EN-US">,</span>就是反码求和<span lang="EN-US">校验.</span>需要注意的是反码求和又叫<span lang="EN-US">1</span>的补码<span lang="EN-US">(one's
complement),</span>而<span lang="EN-US">2</span>的补码就是我们通常说的补码求和了<span lang="EN-US">.</span>校验算法具体如下<span lang="EN-US">.<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: #993366;" lang="EN-US">1</span><span style="font-size: 12pt; font-family: 宋体; color: #993366;">、发送方<span lang="EN-US"><o:p></o:p></span></span><br />
</p>
<p class="MsoNormal" style="text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; i)</span><span style="font-size: 12pt; font-family: 宋体;">将校验和字段置为<span lang="EN-US">0,</span>然后将<span lang="EN-US">IP</span>包头按<span lang="EN-US">16</span>比特分成多个单元<span lang="EN-US">,</span>如包头长度不是<span lang="EN-US">16</span>比特的倍数<span lang="EN-US">,</span>则用<span lang="EN-US">0</span>比特填充到<span lang="EN-US">16</span>比特的倍数<span lang="EN-US">;<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;ii)</span><span style="font-size: 12pt; font-family: 宋体;">对各个单元采用反码加法运算<span lang="EN-US">(</span>即高位溢出位会加到低位<span lang="EN-US">,</span>通常的补码运算是直接丢掉溢出的高位<span lang="EN-US">),</span>将得到的和的反码填入校验和字段<span lang="EN-US">;<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;iii)</span><span style="font-size: 12pt; font-family: 宋体;">发送数据包<span lang="EN-US">;</span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 12pt;" align="left"><br />
<span style="font-size: 12pt; font-family: 宋体;"><span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: #993366;" lang="EN-US">2</span><span style="font-size: 12pt; font-family: 宋体; color: #993366;">、接收方<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;i)</span><span style="font-size: 12pt; font-family: 宋体;">将<span lang="EN-US">IP</span>包头按<span lang="EN-US">16</span>比特分成多个单元<span lang="EN-US">,</span>如包头长度不是<span lang="EN-US">16</span>比特的倍数<span lang="EN-US">,</span>则用<span lang="EN-US">0</span>比特填充到<span lang="EN-US">16</span>比特的倍数<span lang="EN-US">;<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; ii)</span><span style="font-size: 12pt; font-family: 宋体;">对各个单元采用反码加法运算<span lang="EN-US">,</span>检查得到的和是否符合是全<span lang="EN-US">1(</span>有的实现可能对得到的和会取反码<span lang="EN-US">,</span>然后判断最终值是不是全<span lang="EN-US">0);<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; iii)</span><span style="font-size: 12pt; font-family: 宋体;">如果是全<span lang="EN-US">1</span>则进行下步处理<span lang="EN-US">,</span>否则意味着包已变化从而丢弃之<span lang="EN-US">.<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p><br />
</span><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp; 需要强调的是反码和是采用高位溢出加到低位的<span lang="EN-US">,</span>如<span lang="EN-US">3</span>比特的反码和运算<span lang="EN-US">:100b+101b=010b(</span>因为<span lang="EN-US">100b+101b=1001b,</span>高位溢出<span lang="EN-US">1,</span>其应该加到低位<span lang="EN-US">,</span>即<span lang="EN-US">001b+1b(</span>高位溢出位<span lang="EN-US">)=010b),</span>具体细节请参考文章<span lang="EN-US">:<a href="http://blog.chinaunix.net/u/20/showart_438418.html" target="_blank">http://blog.chinaunix.net/u/20/showart_438418.html</a><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 12pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="margin-left: 0cm; text-align: left; text-indent: 0cm;" align="left"><!--[if !supportLists]--><strong><span style="font-size: 14pt; font-family: 宋体; color: blue;" lang="EN-US"><span>二、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span></strong><!--[endif]--><strong><span style="font-size: 14pt; font-family: 宋体; color: blue;">校验和源码<span lang="EN-US"><o:p></o:p></span></span></strong></p>
<p class="MsoNormal" style="text-align: left; text-indent: 24pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;">网上流传多组实现<span lang="EN-US">,</span>常见的有如下两种<span lang="EN-US">(</span>如追求效率可改写为汇编代码<span lang="EN-US">):<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 24pt;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: #993366;" lang="EN-US">1</span><span style="font-size: 12pt; font-family: 宋体; color: #993366;">、<span lang="EN-US">RFC1071</span>源码</span></p>
<table style="border-collapse: collapse;" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0" width="95%">
    <tbody>
        <tr>
            <td>
            <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">short</span> csum<span style="color: #0000cc;">(</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span> <span style="color: #0000cc;">*</span>addr<span style="color: #0000cc;">,</span> <span style="color: #0000ff;">int</span> <span style="color: #ff0000;">count</span><span style="color: #0000cc;">)</span><br />
            <span style="color: #0000cc;">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff9900;">/* Compute Internet Checksum for "count" bytes<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; * beginning at location "addr".<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">register</span> <span style="color: #0000ff;">long</span> sum <span style="color: #0000cc;">=</span> 0<span style="color: #0000cc;">;</span><br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">while</span><span style="color: #0000cc;">(</span> <span style="color: #ff0000;">count</span> <span style="color: #0000cc;">&gt;</span> 1 <span style="color: #0000cc;">)</span> <br />
            </span></code></p>
            <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><span style="color: #0000cc;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff9900;">/* This is the inner loop */</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum <span style="color: #0000cc;">+</span><span style="color: #0000cc;">=</span> <span style="color: #0000cc;">*</span> <span style="color: #0000cc;">(</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">short</span><span style="color: #0000cc;">)</span> addr<span style="color: #0000cc;">+</span><span style="color: #0000cc;">+</span><span style="color: #0000cc;">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">count</span> <span style="color: #0000cc;">-</span><span style="color: #0000cc;">=</span> 2<span style="color: #0000cc;">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000cc;">}</span><br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff9900;">/* Add left-over byte, if any */</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span> <span style="color: #ff0000;">count</span> <span style="color: #0000cc;">&gt;</span> 0 <span style="color: #0000cc;">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum <span style="color: #0000cc;">+</span><span style="color: #0000cc;">=</span> <span style="color: #0000cc;">*</span> <span style="color: #0000cc;">(</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span> <span style="color: #0000cc;">*</span><span style="color: #0000cc;">)</span> addr<span style="color: #0000cc;">;</span><br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff9900;">/* Fold 32-bit sum to 16 bits */</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">while</span> <span style="color: #0000cc;">(</span>sum<span style="color: #0000cc;">&gt;</span><span style="color: #0000cc;">&gt;</span>16<span style="color: #0000cc;">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum <span style="color: #0000cc;">=</span> <span style="color: #0000cc;">(</span>sum <span style="color: #0000cc;">&amp;</span> 0xffff<span style="color: #0000cc;">)</span> <span style="color: #0000cc;">+</span> <span style="color: #0000cc;">(</span>sum <span style="color: #0000cc;">&gt;</span><span style="color: #0000cc;">&gt;</span> 16<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span> <span style="color: #0000cc;">~</span>sum<span style="color: #0000cc;">;</span><br />
            <span style="color: #0000cc;">}</span></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p class="MsoNormal" style="text-align: left; text-indent: 24pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;">第一个<span lang="EN-US">while</span>循环是做普通加法<span lang="EN-US">(2</span>进制补码加法<span lang="EN-US">),</span>因为<span lang="EN-US">IP</span>包头和<span lang="EN-US">TCP</span>整个报文段比较短<span lang="EN-US">(</span>没达到<span lang="EN-US">2^17</span>数量级<span lang="EN-US">),</span>所以不可能导致<span lang="EN-US">4</span>字节的<span lang="EN-US">sum</span>溢出<span lang="EN-US">(unsigned long </span>一般至少为<span lang="EN-US">4</span>字节<span lang="EN-US">)).<br />
&nbsp;&nbsp;&nbsp; </span>紧接着的一个判断语句是为了能处理输入数据是奇数个字节的这种情况<span lang="EN-US">.<br />
&nbsp;&nbsp;&nbsp; </span>再接着的数据循环是实现反码算法<span lang="EN-US">(</span>在前面的普通加法得到的数据的基础上<span lang="EN-US">),</span>由反码和的高位溢出加到低位的性质<span lang="EN-US">,</span>可得到<span lang="EN-US">"3<span style="color: #ff01ff;">2</span></span><span style="color: #ff01ff;">位的数据的高位比特移位16比特,再加上原来的低16比特,不影响最终结果</span><span lang="EN-US">"</span>这个等价运算<span lang="EN-US">,</span>因为<span lang="EN-US">sum</span>的最初值<span lang="EN-US">(</span>刚开始循环时<span lang="EN-US">)</span>可能很大<span lang="EN-US">,</span>所以这个等价运算需循环进行<span lang="EN-US">,</span>直到<span lang="EN-US">sum</span>的高比特<span lang="EN-US">(16</span>比特以上<span lang="EN-US">)</span>全为<span lang="EN-US">0.</span>对于<span lang="EN-US">32</span>位的<span lang="EN-US">sum,</span>事实上这个运算循环至多只有两轮<span lang="EN-US">,</span>所以也有程序直接用两条<span lang="EN-US">"sum = (sum &amp; 0xffff) + (sum &gt;&gt; 16);"</span>代替了整个循环<span lang="EN-US">.<br />
&nbsp;&nbsp;&nbsp; </span>最后<span lang="EN-US">,</span>对和取反返回<span lang="EN-US">.</span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 24pt;" align="left"><br />
<span style="font-size: 12pt; font-family: 宋体;"><span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: #993366;" lang="EN-US">2</span><span style="font-size: 12pt; font-family: 宋体; color: #993366;">、对数据长度没限制的实现<span lang="EN-US"><o:p></o:p></span></span></p>
<table style="border-collapse: collapse;" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0" width="95%">
    <tbody>
        <tr>
            <td>
            <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">short</span> cksum <span style="color: #0000cc;">(</span><span style="color: #0000ff;">struct</span> ip <span style="color: #0000cc;">*</span>ip<span style="color: #0000cc;">,</span> <span style="color: #0000ff;">int</span> len<span style="color: #0000cc;">)</span><br />
            <span style="color: #0000cc;">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">long</span> sum <span style="color: #0000cc;">=</span> 0<span style="color: #0000cc;">;</span>                                <span style="color: #ff9900;">/* assume 32 bit long, 16 bit short */</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">while</span> <span style="color: #0000cc;">(</span> len <span style="color: #0000cc;">&gt;</span>1 <span style="color: #0000cc;">)</span> <br />
            </span></code></p>
            <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><span style="color: #0000cc;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><br />
            </span></code></p>
            <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum <span style="color: #0000cc;">+</span><span style="color: #0000cc;">=</span> <span style="color: #0000cc;">*</span><span style="color: #0000cc;">(</span><span style="color: #0000cc;">(</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">short</span> <span style="color: #0000cc;">*</span><span style="color: #0000cc;">)</span> ip<span style="color: #0000cc;">)</span><span style="color: #0000cc;">+</span><span style="color: #0000cc;">+</span><span style="color: #0000cc;">;</span></span></code></p>
            <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if</span> <span style="color: #0000cc;">(</span>sum <span style="color: #0000cc;">&amp;</span> 8x00000000<span style="color: #0000cc;">)</span>       <span style="color: #ff9900;">/* if high-order bit set, fold */</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum <span style="color: #0000cc;">=</span> <span style="color: #0000cc;">(</span>sum <span style="color: #0000cc;">&amp;</span> 0xFFFF<span style="color: #0000cc;">)</span> <span style="color: #0000cc;">+</span> <span style="color: #0000cc;">(</span>sum<span style="color: #0000cc;">&gt;</span><span style="color: #0000cc;">&gt;</span> 16<span style="color: #0000cc;">)</span> <span style="color: #0000cc;">;</span><br />
            </span></code></p>
            <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; len <span style="color: #0000cc;">-</span><span style="color: #0000cc;">=</span> 2<span style="color: #0000cc;">;</span></span></code></p>
            <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><span style="color: #0000cc;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">if</span> <span style="color: #0000cc;">(</span> len <span style="color: #0000cc;">)</span>                                      <span style="color: #ff9900;">/* take care of left over byte */</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum <span style="color: #0000cc;">+</span><span style="color: #0000cc;">=</span> <span style="color: #0000cc;">(</span> <span style="color: #0000ff;">unsigned</span>  <span style="color: #0000ff;">short</span>  <span style="color: #0000cc;">)</span> <span style="color: #0000cc;">*</span> <span style="color: #0000cc;">(</span>unsignedl <span style="color: #0000ff;">char</span> <span style="color: #0000cc;">*</span><span style="color: #0000cc;">)</span> ip<span style="color: #0000cc;">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">while</span> <span style="color: #0000cc;">(</span> sum <span style="color: #0000cc;">&gt;</span><span style="color: #0000cc;">&gt;</span> 16<span style="color: #0000cc;">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum <span style="color: #0000cc;">=</span><span style="color: #0000cc;">(</span>sum <span style="color: #0000cc;">&amp;</span> 0xFFFF<span style="color: #0000cc;">)</span> <span style="color: #0000cc;">+</span> <span style="color: #0000cc;">(</span>sum<span style="color: #0000cc;">&gt;</span><span style="color: #0000cc;">&gt;</span> 16<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span></span></code></p>
            <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;">
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">return</span> <span style="color: #0000cc;">~</span>sum<span style="color: #0000cc;">;</span></span></code></p>
            <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;">}
            <br />
            </span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p class="MsoNormal" style="text-align: left;" align="left">
</p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;"><span>&nbsp;</span>&nbsp;&nbsp; 这个实现与前面的一个的最大的不同是对数据的长度没什么限制了<span lang="EN-US">,</span>因为它在第一个循环的加法运算中实时检测<span lang="EN-US">sum</span>的高位的值<span lang="EN-US">,</span>一旦发现其有溢出的危险<span lang="EN-US">,</span>就及时运用等价运算关系消除了这个危险<span lang="EN-US">.</span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><br />
<span style="font-size: 12pt; font-family: 宋体;"><span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 0cm; text-align: left; text-indent: 0cm;" align="left"><!--[if !supportLists]--><strong><span style="font-size: 14pt; font-family: 宋体; color: blue;" lang="EN-US"><span>三、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span></strong><!--[endif]--><strong><span style="font-size: 14pt; font-family: 宋体; color: blue;">几个细节问题<span lang="EN-US"><o:p></o:p></span></span></strong></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;<span style="color: #993366;"> 1</span></span><span style="font-size: 12pt; font-family: 宋体; color: #993366;">、数据部分改变时的重校验</span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: 宋体;">考虑这样的应用场景<span lang="EN-US">:</span>路由器转发<span lang="EN-US">IP</span>报文时<span lang="EN-US">,</span>有可能只更改了<span lang="EN-US">IP</span>数据包头的部分内容<span lang="EN-US">(</span>如更改了<span lang="EN-US">TTL,</span>分片了或<span lang="EN-US">SNAT</span>更改了源<span lang="EN-US">IP</span>等<span lang="EN-US">~~~),</span>却需要重校验的问题<span lang="EN-US">.</span>为提高转发效率<span lang="EN-US">,</span>要求重校验算法尽可能快<span lang="EN-US">,</span>故出现了如下的重校验算法<span lang="EN-US">: <br />
</span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<table style="border-collapse: collapse;" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0" width="95%">
    <tbody>
        <tr>
            <td>
            <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;">UpdateTTL<span style="color: #0000cc;">(</span></span></code><code><span style="color: #000000;"><span style="color: #0000ff;">struct</span> ip_hdr <span style="color: #0000cc;">*</span>ipptr</span></code><code><span style="color: #000000;"><span style="color: #0000cc;">, </span></span></code><code><span style="color: #000000;"><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span> n</span></code><code><span style="color: #000000;"><span style="color: #0000cc;">)</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            <span style="color: #0000cc;">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">long</span> sum<span style="color: #0000cc;">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">short</span> old<span style="color: #0000cc;">;</span><br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; old <span style="color: #0000cc;">=</span> <span style="color: #ff0000;">ntohs</span><span style="color: #0000cc;">(</span><span style="color: #0000cc;">*</span><span style="color: #0000cc;">(</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">short</span> <span style="color: #0000cc;">*</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">&amp;</span>ipptr<span style="color: #0000cc;">-</span><span style="color: #0000cc;">&gt;</span>ttl<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp; ipptr<span style="color: #0000cc;">-</span><span style="color: #0000cc;">&gt;</span>ttl <span style="color: #0000cc;">-</span><span style="color: #0000cc;">=</span> n<span style="color: #0000cc;">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp; sum <span style="color: #0000cc;">=</span> old <span style="color: #0000cc;">+</span> <span style="color: #0000cc;">(</span><span style="color: #0000cc;">~</span><span style="color: #ff0000;">ntohs</span><span style="color: #0000cc;">(</span><span style="color: #0000cc;">*</span><span style="color: #0000cc;">(</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">short</span> <span style="color: #0000cc;">*</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">&amp;</span>ipptr<span style="color: #0000cc;">-</span><span style="color: #0000cc;">&gt;</span>ttl<span style="color: #0000cc;">)</span> <span style="color: #0000cc;">&amp;</span> 0xffff<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp; sum <span style="color: #0000cc;">+</span><span style="color: #0000cc;">=</span> <span style="color: #ff0000;">ntohs</span><span style="color: #0000cc;">(</span>ipptr<span style="color: #0000cc;">-</span><span style="color: #0000cc;">&gt;</span>Checksum<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp; sum <span style="color: #0000cc;">=</span> <span style="color: #0000cc;">(</span>sum <span style="color: #0000cc;">&amp;</span> 0xffff<span style="color: #0000cc;">)</span> <span style="color: #0000cc;">+</span> <span style="color: #0000cc;">(</span>sum<span style="color: #0000cc;">&gt;</span><span style="color: #0000cc;">&gt;</span>16<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp; ipptr<span style="color: #0000cc;">-</span><span style="color: #0000cc;">&gt;</span>Checksum <span style="color: #0000cc;">=</span> <span style="color: #ff0000;">htons</span><span style="color: #0000cc;">(</span>sum <span style="color: #0000cc;">+</span> <span style="color: #0000cc;">(</span>sum<span style="color: #0000cc;">&gt;</span><span style="color: #0000cc;">&gt;</span>16<span style="color: #0000cc;">)</span><span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span></span></code></p>
            <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><span style="color: #0000cc;">}</span><br />
            </span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p class="MsoNormal"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp; 算法的实现依据是这样的<span lang="EN-US">.</span>假设包头原校验和为<span lang="EN-US">~C,</span>改变的字段的原始值是<span lang="EN-US">m,</span>更改后的值是<span lang="EN-US">m',</span>设<span lang="EN-US">~C'</span>为重校验和<span lang="EN-US">,</span>则有<span lang="EN-US"> ~C' = ~(C+(-m)+m') = ~C+(m-m') = ~C+m+~m' <br />
&nbsp;&nbsp;&nbsp;
</span>等价关系的成立基于反码的运算性质<span lang="EN-US">:</span><span style="color: #ff01ff;">取反运算满足结合律,按位取反运算与符号取反(及相反数)是等价的(即</span><span lang="EN-US"><span style="color: #ff01ff;">~C=-C).</span><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: 12pt; font-family: 宋体; color: #993366;" lang="EN-US">2</span><span style="font-size: 12pt; font-family: 宋体; color: #993366;">、为什么采用反码和运算<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp; IP</span><span style="font-size: 12pt; font-family: 宋体;">数据包校验要求速度快<span lang="EN-US">,</span>所以只采用了简单的和校验<span lang="EN-US">,</span>为什么采用反码和而不是补码和呢<span lang="EN-US">?<br />
&nbsp;&nbsp; i)</span><span style="color: #ff01ff;">反码和的溢出有后效性(蔓延性</span><span lang="EN-US"><span style="color: #ff01ff;">)</span><br />
&nbsp;&nbsp;&nbsp; </span>反码和将高位溢出加到低位<span lang="EN-US">,</span>导致这个溢出会对后面操作有永久影响<span lang="EN-US">,</span>有后效性<span lang="EN-US">;</span>而补码和直接将高位和溢出<span lang="EN-US">,</span>导致这个溢出对后面的操作再无影响<span lang="EN-US">,</span>因此无后效性<span lang="EN-US"><br />
&nbsp;&nbsp; ii)</span><span style="color: #ff01ff;">反码校验无需考虑字节序</span><span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp; </span>正因为反码和的溢出有后效性<span lang="EN-US">,</span>导致大端字节序<span lang="EN-US">(big-endian)</span>和小端字节序<span lang="EN-US">(little-endian)</span>对同一数据序列<span lang="EN-US">(</span>如两个<span lang="EN-US">16</span>比特的序列<span lang="EN-US">)</span>产生的校验和也只是字节序相反，而补码和因为将溢出丢掉了<span lang="EN-US">,</span>不同字节序之间的校验大不相同且没什么联系。<span lang="EN-US"><br />
&nbsp;&nbsp; </span>基于以上的理由，校验和运算既可选择在数据被转换成网络字节序前，也可选择在之后。（<span style="color: #ff01ff;">这其实可以看作是负负得正，计算校验和与字节序有关，然后写校验和字段与字节序有关，然后直接计算校验和再写校验和字段则与字节序无关了</span><span lang="EN-US">~~</span>）<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 0cm; text-align: left; text-indent: 0cm;" align="left"><!--[if !supportLists]--><strong><span style="font-size: 14pt; font-family: 宋体; color: blue;" lang="EN-US"><span>四、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span></strong><!--[endif]--><strong><span style="font-size: 14pt; font-family: 宋体; color: blue;">参考文章<span lang="EN-US"><o:p></o:p></span></span></strong></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">http://blog.chinaunix.net/u/20/showart_438512.html</span><span style="font-size: 12pt; font-family: 宋体;">，关于<span lang="EN-US">IP</span>校验和的<span lang="EN-US"><br />
http://blog.chinaunix.net/u/12313/showart_176114.html</span>，关于网络校验和的<span lang="EN-US"><br />
http://www.wesoho.com/article/Delphi/2143.htm</span>，关于<span lang="EN-US">IP</span>校验和的<span lang="EN-US"><br />
http://blog.chinaunix.net/u/20/showart_438418.html</span>，关于补码和反码的</span></p>
<img src ="http://www.blogjava.net/calvinlau/aggbug/286494.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">iConnect</a> 2009-07-12 23:42 <a href="http://www.blogjava.net/calvinlau/articles/286494.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数组循环位移</title><link>http://www.blogjava.net/calvinlau/articles/280414.html</link><dc:creator>iConnect</dc:creator><author>iConnect</author><pubDate>Sun, 07 Jun 2009 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/280414.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/280414.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/280414.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/280414.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/280414.html</trackback:ping><description><![CDATA[给定有N个元素数组，将之循环移K位，不能使用库函数，不能使用辅助数组，要求时间复杂度为O(N)<br />
<br />
解法1：<br />
思路：<br />
（1） 整个数组倒序<br />
（2）0 - K位倒序<br />
（3）K - (N-1)位倒序<br />
<br />
代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;printArray(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a[],</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n){<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">n;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d\t</span><span style="color: #000000;">"</span><span style="color: #000000;">,a[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
}<br />
<br />
</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;reverse(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a[],&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;begin,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;end){<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(end</span><span style="color: #000000;">-</span><span style="color: #000000;">begin</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">/</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">n;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;t&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;a[begin</span><span style="color: #000000;">+</span><span style="color: #000000;">i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[begin</span><span style="color: #000000;">+</span><span style="color: #000000;">i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;a[end</span><span style="color: #000000;">-</span><span style="color: #000000;">i</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[end</span><span style="color: #000000;">-</span><span style="color: #000000;">i</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;t;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;shift(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a[],&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;k){<br />
&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(n</span><span style="color: #000000;">+</span><span style="color: #000000;">k</span><span style="color: #000000;">%</span><span style="color: #000000;">n)</span><span style="color: #000000;">%</span><span style="color: #000000;">n;<br />
&nbsp;&nbsp;&nbsp;&nbsp;reverse(a,</span><span style="color: #000000;">0</span><span style="color: #000000;">,n);<br />
&nbsp;&nbsp;&nbsp;&nbsp;reverse(a,</span><span style="color: #000000;">0</span><span style="color: #000000;">,k);<br />
&nbsp;&nbsp;&nbsp;&nbsp;reverse(a,k,n);<br />
}<br />
<br />
</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a[]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">4</span><span style="color: #000000;">,</span><span style="color: #000000;">5</span><span style="color: #000000;">,</span><span style="color: #000000;">6</span><span style="color: #000000;">,</span><span style="color: #000000;">7</span><span style="color: #000000;">,</span><span style="color: #000000;">8</span><span style="color: #000000;">};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(a)</span><span style="color: #000000;">/</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;printArray(a,n);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">shift(a,n,-1);</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shift(a,n,</span><span style="color: #000000;">4</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;printArray(a,</span><span style="color: #000000;">8</span><span style="color: #000000;">);<br />
}</span></div>
<br />
<br />
解法2：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Output(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pBuffer,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nCount)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">pBuffer&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">nCount)&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(size_t&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;nCount;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;%d&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;pBuffer[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<br />
}<br />
<br />
</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;ShiftN(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pBuffer,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nCount,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nShiftN)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">pBuffer&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">nCount&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">nShiftN)&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;nShiftN&nbsp;</span><span style="color: #000000;">%=</span><span style="color: #000000;">&nbsp;nCount;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nIndex&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nStart&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;nIndex;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nTemp&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pBuffer[nIndex];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(size_t&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;nCount;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nIndex&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(nIndex&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;nShiftN)&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;nCount;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pBuffer[nIndex]&nbsp;</span><span style="color: #000000;">^=</span><span style="color: #000000;">&nbsp;nTemp&nbsp;</span><span style="color: #000000;">^=</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pBuffer[nIndex]&nbsp;</span><span style="color: #000000;">^=</span><span style="color: #000000;">&nbsp;nTemp&nbsp;;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(nIndex&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;nStart)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nStart&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nIndex&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;nStart;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nTemp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pBuffer[nIndex];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;buffer[]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">12</span><span style="color: #000000;">};<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nCount&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(buffer)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Output(buffer,&nbsp;nCount);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;ShiftN(buffer,&nbsp;nCount,&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Output(buffer,&nbsp;nCount);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
}</span></div>
<br />
<img src ="http://www.blogjava.net/calvinlau/aggbug/280414.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">iConnect</a> 2009-06-07 12:00 <a href="http://www.blogjava.net/calvinlau/articles/280414.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单链表反转</title><link>http://www.blogjava.net/calvinlau/articles/279908.html</link><dc:creator>iConnect</dc:creator><author>iConnect</author><pubDate>Wed, 03 Jun 2009 14:47:00 GMT</pubDate><guid>http://www.blogjava.net/calvinlau/articles/279908.html</guid><wfw:comment>http://www.blogjava.net/calvinlau/comments/279908.html</wfw:comment><comments>http://www.blogjava.net/calvinlau/articles/279908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/calvinlau/comments/commentRss/279908.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/calvinlau/services/trackbacks/279908.html</trackback:ping><description><![CDATA[相关定义：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--> <span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;LNode{<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;e;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; LNode</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;next;<br />
</span><span style="color: #000000;">};<br />
&nbsp;
</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">typedef&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;LNode</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;LinkList;</span></div>
<br />
非递归方法：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">//l 是带头结点的单链表<br />
void</span><span style="color: #000000;">&nbsp;ReverseList(LinkList&nbsp;l){<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(l</span><span style="color: #000000;">==</span><span style="color: #000000;">NULL&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;l</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;NULL)<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; LNode&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">p,&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">q,&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">r;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;l</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; q&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">while</span><span style="color: #000000;">(&nbsp;q&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;NULL){<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;q</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;q;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;r;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; }<br />
&nbsp;
</span><span style="color: #000000;"><br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; l</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; l</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p;<br />
</span><span style="color: #000000;">}</span></div>
<br />
递归方法：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">LNode</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;ReverseList_Recursive(LNode</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pNode,LinkList</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;l){<br />
&nbsp;
</span><span style="color: #000000;"><br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;(pNode&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #000000;">NULL</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;(pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #000000;">NULL</span><span style="color: #000000;">)&nbsp;){<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pNode;&nbsp;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;pNode;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; }<br />
</span><span style="color: #000000;"><br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; LNode</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;temp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ReverseList_Recursive(pNode</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next,&nbsp;l);<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; temp</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pNode;<br />
</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;pNode;<br />
</span><span style="color: #000000;">}</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/calvinlau/aggbug/279908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/calvinlau/" target="_blank">iConnect</a> 2009-06-03 22:47 <a href="http://www.blogjava.net/calvinlau/articles/279908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>