<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Gigabyte</title><subtitle type="text">香依香偎孤旅独行的驿站</subtitle><id>http://feed.cnblogs.com/blog/u/3934/rss</id><updated>2010-05-20T00:28:45Z</updated><author><name>香依香偎孤旅独行的驿站</name><uri>http://www.cnblogs.com/Gigabyte/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Gigabyte/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/3934/rss"/><entry><id>http://www.cnblogs.com/Gigabyte/archive/2010/05/20/Reader-Notes-03.html</id><title type="text">读书笔记三</title><summary type="text">《编程珠玑》第三章问题一：请将一个具有n个元素的一维向量x向左旋转i个位置。例如，假设n=8，i=3，那么向量abcdefgh旋转之后得到向量defghabc。简单编码，使用一个具有n个元素的中间向量，分n步即可完成功能。你可以仅用几十字节的微小内存，花费与n成比例的时间来旋转向量么？方案一：实现一个函数，用来将向量向左旋转1个位置。循环调用此函数i次即可。本方案节省空间（只需要一个元素的额外存储...</summary><published>2010-05-20T00:29:00Z</published><updated>2010-05-20T00:29:00Z</updated><author><name>香依香偎孤旅独行的驿站</name><uri>http://www.cnblogs.com/Gigabyte/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Gigabyte/archive/2010/05/20/Reader-Notes-03.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Gigabyte/archive/2010/05/20/Reader-Notes-03.html"/><content type="html">&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;《编程珠玑》第三章&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;问题一：请将一个具有n个元素的一维向量x向左旋转i个位置。&lt;br /&gt;例如，假设n=8，i=3，那么向量abcdefgh旋转之后得到向量defghabc。&lt;br /&gt;简单编码，使用一个具有n个元素的中间向量，分n步即可完成功能。&lt;br /&gt;你可以仅用几十字节的微小内存，花费与n成比例的时间来旋转向量么？&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;方案一：实现一个函数，用来将向量向左旋转1个位置。循环调用此函数i次即可。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;本方案节省空间（只需要一个元素的额外存储），但是浪费了时间（需要做很多次中间操作的搬迁）。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; MAIN(vector x, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; n)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; ei &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; ei &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; i; ei &lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;        x &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; leftshift1(x, n);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; OK;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;vector leftshift1 (vector &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; x, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; n)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;    element first &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; x[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; ei &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; ei &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; n; ei &lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;        x[ei] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; x[ei&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;    x[n &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; first;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; x;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;span style="color: #ff00ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;方案二：将前i个元素复制到额外存储中，将后n-i个元素前移i个元素，再把额外存储中的数据拷贝到向量的最后i个空间里。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;本方案使用了i个元素的额外存储，过于浪费空间。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; MAIN (vector x, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; n)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;    vector y &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;build vector with n elements&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;copy i elements from top x to y&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    memcpy(y, x, i &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(x[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;copy n-i elements from end x to y&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    memmove(x, x &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; i, (n &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; i) &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(x[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;copy i elements from y to end x&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    memcpy(x &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; (n &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; i), y,  i &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(x[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; OK;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;方案三：设前i个元素为a，后n-i个元素为b。则向量x可以表示为 ab，转换后的向量可以表示为 ba。&lt;br /&gt;而只需要将a和b分别转置得到 a'b'，再对整个向量进行转置，就可以得到最终的向量 ba。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;本方案代码简洁清晰，只是计算量增加了一倍（多做了一次位移）。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; MAIN (vector x, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; n)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;    x &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; reserveVector(x, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, i&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;    x &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; reserveVector(x, i, n&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;    x &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; reserveVector(x, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, n&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; OK;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;vector reserveVector(vector &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; x, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; startPos, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; endPos)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; s &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; startPos;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; e &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; endPos;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;(s &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; e)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;        swap(x[s], x[e]);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;        s &lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;        e &lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; x;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; swap (element &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; s, element &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; e)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt; &lt;span style="color: #000000;"&gt;    element t &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; s;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt; &lt;span style="color: #000000;"&gt;    s &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; e;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt; &lt;span style="color: #000000;"&gt;    e &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; t;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; OK;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;方案四：直接计算各个元素的最终位置。&lt;br /&gt;对于前i个元素，假设初始位置为t(0&amp;lt;=t&amp;lt;i)，则最终位置应该是 (n - i + t)&lt;br /&gt;对于后 n-i 个元素，假设初始位置为t(i&amp;lt;=t&amp;lt;n)，则最终位置相当于前移了i，应该是 (t - i)&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;本方案的代码并没有前述方案的简洁，但是计算量最少，并且没有冗余的搬移。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; MAIN (vector x, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; n)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; s &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; c &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;    element f;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;    s &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;    f &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; x[s];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; (c &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; n)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;get final position of current element s&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; e &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetFinalPosition(s, i, n);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;store original value in current position to tmp value&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        element t &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; x[e];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;fill current element s into final position&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        x[e] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; f;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;increase count&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        c &lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;prepare for next&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        s &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; e;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;store original value from tmp value&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        f &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; t;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; OK;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetFinalPosition(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; t, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; n)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (t &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; i)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; (n &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; i) &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; t;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; ((t &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; i) &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; (t &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; n))&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;40&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; (t &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; i);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;41&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;42&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; t;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;43&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Gigabyte/aggbug/1739733.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Gigabyte/archive/2010/05/20/Reader-Notes-03.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Gigabyte/archive/2010/04/16/Reader-Notes-02.html</id><title type="text">读书笔记二</title><summary type="text">《编程珠玑》第二章问题一：给定一个包含40亿个32位整数的文件，整数排列次序随机。请查找一个此文件中不存在的32位整数。解答：32位整数共有0xFFFFFFFF个。如果用一个bit标示一个整数，一共需要约537MB内存。如果内存足够，就构建一个这样大的位图，就可以很快找到的不存在的整数了。问题二：问题一中，如果内存限制为100MB，如何实现？解答：可以采用之前提过的多通道算法，对文件读取六次，每次...</summary><published>2010-04-15T17:48:00Z</published><updated>2010-04-15T17:48:00Z</updated><author><name>香依香偎孤旅独行的驿站</name><uri>http://www.cnblogs.com/Gigabyte/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Gigabyte/archive/2010/04/16/Reader-Notes-02.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Gigabyte/archive/2010/04/16/Reader-Notes-02.html"/><content type="html">&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;《编程珠玑》第二章&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;问题一：给定一个包含40亿个32位整数的文件，整数排列次序随机。&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;请查找一个此文件中不存在的32位整数。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;解答：32位整数共有0xFFFFFFFF个。&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;如果用一个bit标示一个整数，一共需要约537MB内存。如果内存足够，就构建一个这样大的位图，就可以很快找到的不存在的整数了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;问题二：问题一中，如果内存限制为100MB，如何实现？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;解答：可以采用之前提过的多通道算法，对文件读取六次，每次只读取 [(0xFFFFFFFF / 6) * (n - 1), (0xFFFFFFFF / 6) * n] 范围内的整数。&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;问题三：问题一中，如果内存限制为只有数百字节，如何实现？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;解答：如果采用前面提到的多通道算法，也可以实现，但是这样会需要划分成数百万个通道，并且对文件进行数百万次遍历，代价过大，得不偿失。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;换个思路，我们不去对32位整数的数值范围进行划分，转而针对整数的bit位进行划分。这些整数的bit位只有32个，每个bit的取值只有0和1。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&#xD;
&lt;pre &gt;首先读取一遍文件，分别记录下bit 0为0和1的整数个数。选择个数较少的一种。&#xD;
&#xD;
第二遍读取文件，在前一次选择的整数中，分别记录下bit 1为0和1的整数个数。选择个数较少的一种。&#xD;
&#xD;
第三遍读取文件，在前一次选择的整数中，分别记录下bit 2为0和1的整数个数。选择个数较少的一种。&#xD;
&#xD;
&amp;hellip;&amp;hellip;&#xD;
&#xD;
第三十二遍读取文件，在前一次选择的整数中，分别记录下bit 32为0和1的整数个数。&#xD;
&lt;/pre&gt;&#xD;
&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;在上述三十二次连续读取过程中，一定会有遇到某次读取完成后，某bit位的某一类值的个数为0的情况。此时，我们就可以输出遗漏的整数：整数的低bit位，由之前的读取过滤规则决定；整数的高bit位可以随意填写；当前统计的bit位直接填写个数为0的那个类别。这样，最多只需要三十二次遍历文件就可以完成搜寻。这个方法的缺点是，需要多次遍历文件中所有的整数，尽管每次只需要上一次需要关注的整数的1/2。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;问题四：问题三中，能否减少整数的读取和判断次数？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;解答：将问题三的解答略作修改，给每个整数增加一个前缀。第一次遍历文件的时候，将对应bit位为1的整数加上前缀1写入文件1，将对应bit位为0的整数加上前缀0写入文件2。统计完成，下一次遍历直接选取本次生成的两个文件之一。这样每次遍历的整数数量都不超过上一次遍历的整数个数的一半，可以大大减少整数的读取和判断次数。只是需要借助临时文件。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;问题五：给定一个包含43亿个32位整数的文件，整数排列次序随机。&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;请查找一个此文件中至少出现两次的32位整数。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;解答：如果采用问题一的方法，在向位图的某个bit写入整数存在标志1的时候，判断该bit位是否已经置1。若是，则该整数重复。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;如果采用问题二、问题三、问题四的方法，将&amp;ldquo;选择个数较少的一种&amp;rdquo;改为&amp;ldquo;选择个数较多的一种&amp;rdquo;，将&amp;ldquo;查找某一类统计数据为0则退出&amp;rdquo;改为&amp;ldquo;最后一次遍历查找某一类统计大于1则返回&amp;rdquo;即可。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Gigabyte/aggbug/1713156.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Gigabyte/archive/2010/04/16/Reader-Notes-02.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Gigabyte/archive/2010/04/14/Reader-Notes-01.html</id><title type="text">读书笔记一</title><summary type="text">《编程珠玑》第一章问题一：一个文件包含了10,000,000个记录，每个记录的内容是7位的整数。记录不会重复。需要一个程序来读取文件内容，需要将这些记录排序后输出文件，内存限制1M左右。解答：由于记录不会重复，因此每个记录用一个bit标示，就可以很简单的完成记录的标记和排序。这样需要大约1.25M的内存，时间和空间都不大。问题二：问题一中，如果严格限定不能超过1M的内存呢？解答：多通道进行，以时间...</summary><published>2010-04-13T16:50:00Z</published><updated>2010-04-13T16:50:00Z</updated><author><name>香依香偎孤旅独行的驿站</name><uri>http://www.cnblogs.com/Gigabyte/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Gigabyte/archive/2010/04/14/Reader-Notes-01.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Gigabyte/archive/2010/04/14/Reader-Notes-01.html"/><content type="html">&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;《编程珠玑》第一章&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;问题一：一个文件包含了10,000,000个记录，每个记录的内容是7位的整数。记录不会重复。需要一个程序来读取文件内容，需要将这些记录排序后输出文件，内存限制1M左右。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;解答：由于记录不会重复，因此每个记录用一个bit标示，就可以很简单的完成记录的标记和排序。这样需要大约1.25M的内存，时间和空间都不大。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;pre &gt;/* Phase 1: initialize set to empty */&#xD;
for i = [0, n)&#xD;
    bit[i] = 0&#xD;
/* Phase 2: insert present elements into the set */&#xD;
for each i in the input file&#xD;
    bit[i] = 1&#xD;
/* Phase 3: write sorted output */&#xD;
for i = [0, n)&#xD;
    if bit[i] = 1&#xD;
        write i on the output file&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;span style="color: #ff00ff;"&gt;问题二：问题一中，如果严格限定不能超过1M的内存呢？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;解答：多通道进行，以时间换空间。扫描两遍源文件，第一次只检查0x7FFFFFFF以下的数值，标记并输出；第二次读取源文件，此时只记录和检查0x80000000以上的数值，标记并输出。这样需要大约0.63M的内存。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;问题三：问题一中，如果每个整数不是最多出现一次，而是最多出现十次呢？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;解答：那就需要通过4个bit来记录每个记录，而不是之前的1个bit。这样，内存占用需要扩大四倍。如果仍然保持不变的内存限制，那就只好继续划分多个通道分别处理了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;问题四：问题一中，如果能减少初始化整段bit数组的时间？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;解答：两个方法。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;方法一：将bit数组定义为没有手动初始化的全局变量，将其编译到bss段中。这样，程序被栽入内存的时候，操作系统自动会将bss段的内容置0。也就是说，可以将系统运行时占用的时间，提前到系统被加载时。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;方法二：（书上的解法&amp;nbsp;）设整段数组的元素个数为n，数组为data&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;。另定义两个包含n个元素的数组from和to，初始化全局变量t=0。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;当需要设置data[i]的数值前，执行以下代码:&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&#xD;
&lt;pre &gt;from[i]  = t;&#xD;
to[t]    = i;&#xD;
data[i]  = 0;&#xD;
t++;&#xD;
&lt;/pre&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;这样可以只设置需要设置的元素项，并通过from、to和全局变量t来共同保证数据可靠性，替代通常的把整段数组memset的做法。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;偶对书上提供的方法二有疑问：在i和t可能较大的情况下，from和to数组的元素类型就不得不设置为unsigned long，这样耗用的内存未免过大，相比而言真正需要操作的data数组的每个元素仅占1个bit。这样是不是有点得不偿失？&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Gigabyte/aggbug/1709919.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Gigabyte/archive/2010/04/14/Reader-Notes-01.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Gigabyte/archive/2010/02/15/jisuanjijiafa.html</id><title type="text">计算机加法</title><summary type="text">数学中最简单的运算就是加法和减法。然而在计算机中，最简单的运算却是 AND、OR 和 NOT。那计算机是如何计算这三个基本操作，通过这三个基本操作又是如何计算出数学中的加法呢？</summary><published>2010-02-15T13:48:00Z</published><updated>2010-02-15T13:48:00Z</updated><author><name>香依香偎孤旅独行的驿站</name><uri>http://www.cnblogs.com/Gigabyte/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Gigabyte/archive/2010/02/15/jisuanjijiafa.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Gigabyte/archive/2010/02/15/jisuanjijiafa.html"/><content type="html">&lt;p align="left"&gt;&lt;span style="font-family: System; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 数学中最简单的运算就是加法和减法。然而在计算机中，最简单的运算却是 AND、OR 和 NOT。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-family: System; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;一、AND&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-family: System; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 物理课上，我们都作过串联实验。&lt;/span&gt;&lt;span style="font-family: System; color: #ff00ff;"&gt;把两个开关依次起来之后，如果还要点亮灯泡，就必须同时闭合两个开关。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;span style="font-family: System; color: #ff00ff;"&gt;&lt;img height="104" width="233" src="http://images.cnblogs.com/cnblogs_com/Gigabyte/WindowsLiveWriter/85b53153341a_DE86/02-2switchCircuit_1.png" alt="串联的开关" border="0" title="串联的开关" style="display: inline; border-width: 0px;" /&gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-family: System; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 将开关闭合定义为1，开关断开定义为0；将灯泡点亮定义为1，灯泡熄灭定义为0。则串联的两个开关与灯泡的关联规则是：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div align="center"&gt;&lt;span style="color: #ff00ff;"&gt;&#xD;
&lt;pre &gt;(0 0) -&amp;gt; 0 &#xD;
(1 0) -&amp;gt; 0 &#xD;
(0 1) -&amp;gt; 0 &#xD;
(1 1) -&amp;gt; 1 &#xD;
&lt;/pre&gt;&#xD;
&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这个规则与布尔代数中的 AND 操作规则完全一致。&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div align="center"&gt;&lt;span style="color: #ff00ff;"&gt;&#xD;
&lt;pre &gt;(0 AND 0) -&amp;gt; 0 &#xD;
(1 AND 0) -&amp;gt; 0 &#xD;
(0 AND 1) -&amp;gt; 0 &#xD;
(1 AND 1) -&amp;gt; 1 &#xD;
&lt;/pre&gt;&#xD;
&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 于是，将串联的开关作为输入，就灯泡的亮灭作为输出，上面的电路图就构成了计算机中AND操作（与门）的基本结构。当然计算机中的与门没有这么简单，实际上是通过两个继电器（或缓冲器）来实现的，只是基本原理如此。与门的符号如下：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div align="center"&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&lt;img height="66" width="141" src="http://images.cnblogs.com/cnblogs_com/Gigabyte/WindowsLiveWriter/85b53153341a_DE86/05-AndGate_1.png" alt="与门" border="0" title="与门" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" /&gt; &lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: System; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;二、OR&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 提到串联自然会想到并联。把两个开关并联起来，如果还要点亮灯泡，闭合任何一个开关都可以了。&#xD;
&lt;div align="center"&gt;&lt;img height="104" width="233" src="http://images.cnblogs.com/cnblogs_com/Gigabyte/WindowsLiveWriter/85b53153341a_DE86/03-ParaCircuit_1.png" alt="并联的开关" border="0" title="并联的开关" style="display: inline; border: 0px;" /&gt; &lt;/div&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 同样的定义，开关断开闭合与灯泡亮灭的规则为：&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div sytle="color: ff00ff" align="center"&gt;&#xD;
&lt;pre &gt;(0 0) -&amp;gt; 0 &#xD;
(1 0) -&amp;gt; 1 &#xD;
(0 1) -&amp;gt; 1 &#xD;
(1 1) -&amp;gt; 1 &#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这个规则与布尔代数中的 OR 操作规则完全一致。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div align="center"&gt;&lt;span style="color: #ff00ff;"&gt;&#xD;
&lt;pre &gt;(0 OR 0) -&amp;gt; 0 &#xD;
(1 OR 0) -&amp;gt; 1 &#xD;
(0 OR 1) -&amp;gt; 1 &#xD;
(1 OR 1) -&amp;gt; 1 &#xD;
&lt;/pre&gt;&#xD;
&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p align="left"&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 于是，并联开关的电路图就构成了计算机中OR操作（或门）的基本结构。当然，计算机中实际上还是通过两个继电器（或缓冲器）来实现的。 或门的符号为：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div align="center"&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/Gigabyte/WindowsLiveWriter/85b53153341a_DE86/06-OrGate.png"&gt;&lt;img height="66" width="141" src="http://images.cnblogs.com/cnblogs_com/Gigabyte/WindowsLiveWriter/85b53153341a_DE86/06-OrGate_thumb.png" alt="或门" border="0" title="或门" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;三、NOT&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;除去串联和并联，还有一种电路连接方式，叫做短路。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&lt;img height="96" width="170" src="http://images.cnblogs.com/cnblogs_com/Gigabyte/WindowsLiveWriter/85b53153341a_DE86/04-NoCircuit_1.png" alt="短路的开关" border="0" title="短路的开关" style="display: inline; border: 0px;" /&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;上面的连接方式中，当开关断开，灯泡点亮；当开关闭合，灯泡熄灭。其关联规则为&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div align="center"&gt;&lt;span style="color: #ff00ff;"&gt;&#xD;
&lt;pre &gt;(0) -&amp;gt; 1 &#xD;
(1) -&amp;gt; 0 &#xD;
&lt;/pre&gt;&#xD;
&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这正是NOT运算符的运算规则。与AND、OR都需要两个输入不同，NOT运算符的输入只有一个。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div align="center"&gt;&lt;span style="color: #ff00ff;"&gt;&#xD;
&lt;pre &gt;(NOT 0) -&amp;gt; 1 &#xD;
(NOT 1) -&amp;gt; 0 &#xD;
&lt;/pre&gt;&#xD;
&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div align="left"&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;计算机中实现NOT运算符的电路叫做反转器，也就是将输入的信号取反输出。和与门、或门都需要两个两个继电器操作两个输入不同，反转器的实现只需要一个继电器。反转器的符号为：&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p align="center"&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&lt;img height="66" width="134" src="http://images.cnblogs.com/cnblogs_com/Gigabyte/WindowsLiveWriter/85b53153341a_DE86/07-NotGate_1.png" alt="反转器" border="0" title="反转器" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;四、NAND 和 NOR&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;前面的AND、OR和NOT三个运算符之间是可以组合的。如果反转器跟在与门的输出之后，就构成了&amp;ldquo;与非门&amp;rdquo;，其符号如下，运算规则就是将与门的输出反转。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&lt;img height="66" width="141" src="http://images.cnblogs.com/cnblogs_com/Gigabyte/WindowsLiveWriter/85b53153341a_DE86/08-NAndGate_1.png" alt="与非门" border="0" title="与非门" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div align="center"&gt;&lt;span style="color: #ff00ff;"&gt;&#xD;
&lt;pre &gt;(0 NAND 0) -&amp;gt; 1 &#xD;
(1 NAND 0) -&amp;gt; 1 &#xD;
(0 NAND 1) -&amp;gt; 1 &#xD;
(1 NAND 1) -&amp;gt; 0 &#xD;
&lt;/pre&gt;&#xD;
&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;同理，如果反转器跟在或门的输出之后，就构成了&amp;ldquo;或非门&amp;rdquo;，其符号如下，运算规则就是将或门的输出反转。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;img height="66" width="141" src="http://images.cnblogs.com/cnblogs_com/Gigabyte/WindowsLiveWriter/85b53153341a_DE86/09-NOrGate_1.png" alt="或非门" border="0" title="或非门" style="display: block; margin-left: auto; margin-right: auto; border: 0px;" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div align="center"&gt;&lt;span style="color: #ff00ff;"&gt;&#xD;
&lt;pre &gt;(0 NOR 0) -&amp;gt; 1 &#xD;
(1 NOR 0) -&amp;gt; 0 &#xD;
(0 NOR 1) -&amp;gt; 0 &#xD;
(1 NOR 1) -&amp;gt; 0 &#xD;
&lt;/pre&gt;&#xD;
&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div align="left"&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;ldquo;与非门&amp;rdquo;和&amp;ldquo;或非门&amp;rdquo;都是需要两个继电器。&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;五、半加器&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;布尔代数中的AND、OR和NOT三个运算符、以及NAND、NOR两个组合运算符，是计算机可以通过继电器的电路连接就直接实现的。那通过这五个基本运算符，可以实现数学中最普通的加法运算么？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;首先，看一下加法的运算规则。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div align="center"&gt;&lt;span style="color: #ff00ff;"&gt;&#xD;
&lt;pre &gt;(0 + 0) -&amp;gt;  0 &#xD;
(1 + 0) -&amp;gt;  1 &#xD;
(0 + 1) -&amp;gt;  1 &#xD;
(1 + 1) -&amp;gt; 10 &#xD;
&lt;/pre&gt;&#xD;
&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;我们可以把这个规则划分成两个部分：进位与求和。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div align="center"&gt;&lt;span style="color: #ff00ff;"&gt;&#xD;
&lt;pre &gt;进  位           求  和    &#xD;
(0 0) -&amp;gt; 0    (0 0) -&amp;gt; 0 &#xD;
(1 0) -&amp;gt; 0    (1 0) -&amp;gt; 1 &#xD;
(0 1) -&amp;gt; 0    (0 1) -&amp;gt; 1 &#xD;
(1 1) -&amp;gt; 1    (1 1) -&amp;gt; 0 &#xD;
&lt;/pre&gt;&#xD;
&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;仔细看一下进位的规则，会发现与AND操作的规则完全一致。因此，通过一个实现AND操作的&amp;ldquo;与门&amp;rdquo;，就能实现加法中进位的处理。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div align="center"&gt;&lt;span style="color: #ff00ff;"&gt;&#xD;
&lt;pre &gt;进   位            与   门 &#xD;
(0 0) -&amp;gt; 0    (0 AND 0) -&amp;gt; 0 &#xD;
(1 0) -&amp;gt; 0    (1 AND 0) -&amp;gt; 0 &#xD;
(0 1) -&amp;gt; 0    (0 AND 1) -&amp;gt; 0 &#xD;
(1 1) -&amp;gt; 1    (1 AND 1) -&amp;gt; 1 &#xD;
&lt;/pre&gt;&#xD;
&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;span style="color: #ff00ff;"&gt;&lt;img height="66" width="141" src="http://images.cnblogs.com/cnblogs_com/Gigabyte/WindowsLiveWriter/85b53153341a_DE86/05-AndGate_3.png" alt="进位的与门" border="0" title="进位的与门" style="display: block; margin-left: auto; margin-right: auto; border: 0px;" /&gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;再来看求和的规则，与前面提到的几个规则都不一致，但我们可以通过前述规则的组合来实现：将一个&amp;ldquo;与非门&amp;rdquo;和一个&amp;ldquo;或门&amp;rdquo;分别作为&amp;ldquo;与门&amp;rdquo;的输入，看看运算结果：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div align="center"&gt;&lt;span style="color: #ff00ff;"&gt;&#xD;
&lt;pre &gt;((0 NAND 0) AND (0 OR 0)) -&amp;gt; (1 AND 0) -&amp;gt; 0 &#xD;
((1 NAND 0) AND (1 OR 0)) -&amp;gt; (1 AND 1) -&amp;gt; 1 &#xD;
((0 NAND 1) AND (0 OR 1)) -&amp;gt; (1 AND 1) -&amp;gt; 1 &#xD;
((1 NAND 1) AND (1 OR 1)) -&amp;gt; (0 AND 1) -&amp;gt; 0 &#xD;
&lt;/pre&gt;&#xD;
&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;这个运算的结果与求和的规则完全一致。因此，我们只需要通过&amp;ldquo;与非门&amp;rdquo;、&amp;ldquo;或门&amp;rdquo;和&amp;ldquo;与门&amp;rdquo;的组合，就可以实现计算机加法中求和的处理，其电路图如下：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;span style="color: #ff00ff;"&gt;&lt;img height="158" width="365" src="http://images.cnblogs.com/cnblogs_com/Gigabyte/WindowsLiveWriter/85b53153341a_DE86/11-AddSum_1.png" alt="求和的电路" border="0" title="求和的电路" style="display: block; margin-left: auto; margin-right: auto; border: 0px;" /&gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;对于这样复杂的基本操作，我们给他起了一个简单的名字：异或（XOR）。〔啊哈，好熟悉的名字。这个玄妙奇异的运算符，居然是从加法中诞生的。〕异或的符号如下：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&lt;img height="65" width="141" src="http://images.cnblogs.com/cnblogs_com/Gigabyte/WindowsLiveWriter/85b53153341a_DE86/12-AddAll_1.png" alt="异或" border="0" title="异或" style="display: block; margin-left: auto; margin-right: auto; border: 0px;" /&gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;现在我们把进位和求和两部分操作合并起来，就可以得到如下进行加法运算的电路图：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&lt;img height="146" width="348" src="http://images.cnblogs.com/cnblogs_com/Gigabyte/WindowsLiveWriter/85b53153341a_DE86/13-HalfAdd_1.png" alt="半加器" border="0" title="半加器" style="display: block; margin-left: auto; margin-right: auto; border: 0px;" /&gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;现在的这个电路图被称为&amp;ldquo;半加器&amp;rdquo;（Half Adder），因为这里只有两个加数的输入，还没有考虑到更低位进行加法时提供的进位。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;六、全加器&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OK，再把更低位提供的进位作为第三个输入加入我们的计算器中。根据加法规则，我们将之前计算后的求和部分加上更低位的进位，这同样会产生一个进位和一个求和的结果。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&lt;img height="125" width="379" src="http://images.cnblogs.com/cnblogs_com/Gigabyte/WindowsLiveWriter/85b53153341a_DE86/14-LowerGrow_1.png" alt="增加低位进位" border="0" title="增加低位进位" style="display: block; margin-left: auto; margin-right: auto; border: 0px;" /&gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;啊哦，现在有两个进位要处理了。如果同时为1，岂不是要继续进位？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;来分析一下可能性。先假设两次运算的进位均为1。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;既然第二次运算的进位为1，就意味着低位进位和前一次运算结果的求和这两个数值必然都为1。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;而根据假设条件，第一次运算结果的进位也为1。&lt;/span&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那就是说，第一次运算结果的进位和求和都是1。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;这是不符合加法规则的。所以，假设不成立:-)&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;舒了一口气，好在两个进位不可能同时为1。因此，我们最终计算出来的进位结果，应该是这两次进位的或操作（只要有一个进位为1，进位结果就为1）。再给两个进位进行一次OR操作，加上一个&amp;ldquo;或门&amp;rdquo;吧。 &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="center"&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&lt;img height="125" width="379" src="http://images.cnblogs.com/cnblogs_com/Gigabyte/WindowsLiveWriter/85b53153341a_DE86/15-FullAdd_1.png" alt="全加器" border="0" title="全加器" style="display: block; margin-left: auto; margin-right: auto; border: 0px;" /&gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;现在的这张图被称为全加器（Full Adder），它在计算机中通过硬件实现了数学中最最基本的操作：加法。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OK，总结一下。一个&amp;ldquo;与门&amp;rdquo;需要两个继电器，一个&amp;ldquo;或门&amp;rdquo;需要两个继电器，一个&amp;ldquo;反转器&amp;rdquo;需要一个继电器：一个&amp;ldquo;与非门&amp;rdquo;需要两个继电器，一个&amp;ldquo;异或&amp;rdquo;需要六个继电器，一个&amp;ldquo;半加门&amp;rdquo;需要八个继电器，一个&amp;ldquo;全加门&amp;rdquo;需要十八个继电器。如果要计算八位数相加的电路，就一个需要一百四十四个继电器了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: Tahoma; color: #ff00ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;继电器实在是太大了。幸运的是，随着技术进步，继电器早已经不在电脑中使用了。世界上的第一台电脑ENIAC就将继电器抛弃，改为了真空管，可仍然占用了170平方米的空间。现在，我们身边运行的电脑，都是使用晶体管代替了真空管。但计算原理仍然保持一致，计算八位数相加，仍然需要一百四十四个晶体管。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Gigabyte/aggbug/1668636.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Gigabyte/archive/2010/02/15/jisuanjijiafa.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Gigabyte/archive/2010/02/07/jianti_fanti_auto_convert.html</id><title type="text">简繁体转换</title><summary type="text">在页面上自动进行简体和繁体转换的代码</summary><published>2010-02-07T08:25:00Z</published><updated>2010-02-07T08:25:00Z</updated><author><name>香依香偎孤旅独行的驿站</name><uri>http://www.cnblogs.com/Gigabyte/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Gigabyte/archive/2010/02/07/jianti_fanti_auto_convert.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Gigabyte/archive/2010/02/07/jianti_fanti_auto_convert.html"/></entry><entry><id>http://www.cnblogs.com/Gigabyte/archive/2010/01/24/1655198.html</id><title type="text">所未见的2009</title><summary type="text"/><published>2010-01-24T07:26:00Z</published><updated>2010-01-24T07:26:00Z</updated><author><name>香依香偎孤旅独行的驿站</name><uri>http://www.cnblogs.com/Gigabyte/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Gigabyte/archive/2010/01/24/1655198.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Gigabyte/archive/2010/01/24/1655198.html"/></entry><entry><id>http://www.cnblogs.com/Gigabyte/archive/2009/06/18/1505433.html</id><title type="text">质数筛选器</title><summary type="text">质数筛选器</summary><published>2009-06-17T16:23:00Z</published><updated>2009-06-17T16:23:00Z</updated><author><name>香依香偎孤旅独行的驿站</name><uri>http://www.cnblogs.com/Gigabyte/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Gigabyte/archive/2009/06/18/1505433.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Gigabyte/archive/2009/06/18/1505433.html"/></entry><entry><id>http://www.cnblogs.com/Gigabyte/archive/2009/01/03/you_can_shine.html</id><title type="text">让自己闪亮</title><summary type="text"/><published>2009-01-03T14:12:00Z</published><updated>2009-01-03T14:12:00Z</updated><author><name>香依香偎孤旅独行的驿站</name><uri>http://www.cnblogs.com/Gigabyte/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Gigabyte/archive/2009/01/03/you_can_shine.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Gigabyte/archive/2009/01/03/you_can_shine.html"/></entry><entry><id>http://www.cnblogs.com/Gigabyte/archive/2008/09/28/1301115.html</id><title type="text">去医院看病</title><summary type="text">排队三小时，治病只需要十秒钟。 &amp;ldquo;什么问题呀？哦，小问题。好吃好睡就行啦，开点药回去吃吃吧。下一个！&amp;rdquo; 继续排队一小时，交钱领药。回家打开包装，发现几瓶药分别治疗： 神经病。老年痴呆。中风。偏瘫。 OK，问题来了。知道这是什么病么？</summary><published>2008-09-27T16:11:00Z</published><updated>2008-09-27T16:11:00Z</updated><author><name>香依香偎孤旅独行的驿站</name><uri>http://www.cnblogs.com/Gigabyte/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Gigabyte/archive/2008/09/28/1301115.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Gigabyte/archive/2008/09/28/1301115.html"/></entry><entry><id>http://www.cnblogs.com/Gigabyte/archive/2008/01/16/1040631.html</id><title type="text">新手训练课</title><summary type="text">消息来源：Alfred Thompson: How To Teach Your Child to Program M$的Randy Guthrie发现自己的孩子Seth有兴趣学习编程，便开始亲自辅导，并在BOSS的提醒下将辅导的过程以BLOG记之，挺有趣的。如果你也想将某人推入Programmer或者Coder的幻暝界中，不妨参考一下这位微软校园关系经理的博客MIS Laboratory。 Ran...</summary><published>2008-01-15T18:33:00Z</published><updated>2008-01-15T18:33:00Z</updated><author><name>香依香偎孤旅独行的驿站</name><uri>http://www.cnblogs.com/Gigabyte/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Gigabyte/archive/2008/01/16/1040631.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Gigabyte/archive/2008/01/16/1040631.html"/></entry></feed>
