⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 integer_8cpp-source.html

📁 著名的密码库Crypto++的文档 C++语言的杰作。程序员必备。
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<a name="l00108"></a>00108 <span class="preprocessor"></span><span class="preprocessor">        #define LowWord(a)                                      a##0</span><a name="l00109"></a>00109 <span class="preprocessor"></span><span class="preprocessor">        #define HighWord(a)                                     a##1</span><a name="l00110"></a>00110 <span class="preprocessor"></span><span class="preprocessor">        #ifdef _MSC_VER</span><a name="l00111"></a>00111 <span class="preprocessor"></span><span class="preprocessor">                #define MultiplyWords(p, a, b)  p##0 = _umul128(a, b, &amp;p##1);</span><a name="l00112"></a>00112 <span class="preprocessor"></span><span class="preprocessor">                #define Double3Words(c, d)              d##1 = __shiftleft128(d##0, d##1, 1); d##0 = __shiftleft128(c, d##0, 1); c *= 2;</span><a name="l00113"></a>00113 <span class="preprocessor"></span><span class="preprocessor">        #elif defined(__DECCXX)</span><a name="l00114"></a>00114 <span class="preprocessor"></span><span class="preprocessor">                #define MultiplyWords(p, a, b)  p##0 = a*b; p##1 = asm("umulh %a0, %a1, %v0", a, b);</span><a name="l00115"></a>00115 <span class="preprocessor"></span><span class="preprocessor">        #elif CRYPTOPP_BOOL_X64</span><a name="l00116"></a>00116 <span class="preprocessor"></span><span class="preprocessor">                #define MultiplyWords(p, a, b)  asm ("mulq %3" : "=a"(p##0), "=d"(p##1) : "a"(a), "g"(b) : "cc");</span><a name="l00117"></a>00117 <span class="preprocessor"></span><span class="preprocessor">                #define MulAcc(c, d, a, b)              asm ("mulq %6; addq %3, %0; adcq %4, %1; adcq $0, %2;" : "+r"(c), "+r"(d##0), "+r"(d##1), "=a"(p0), "=d"(p1) : "a"(a), "g"(b) : "cc");</span><a name="l00118"></a>00118 <span class="preprocessor"></span><span class="preprocessor">                #define Double3Words(c, d)              asm ("addq %0, %0; adcq %1, %1; adcq %2, %2;" : "+r"(c), "+r"(d##0), "+r"(d##1) : : "cc");</span><a name="l00119"></a>00119 <span class="preprocessor"></span><span class="preprocessor">                #define Acc2WordsBy1(a, b)              asm ("addq %2, %0; adcq $0, %1;" : "+r"(a##0), "+r"(a##1) : "r"(b) : "cc");</span><a name="l00120"></a>00120 <span class="preprocessor"></span><span class="preprocessor">                #define Acc2WordsBy2(a, b)              asm ("addq %2, %0; adcq %3, %1;" : "+r"(a##0), "+r"(a##1) : "r"(b##0), "r"(b##1) : "cc");</span><a name="l00121"></a>00121 <span class="preprocessor"></span><span class="preprocessor">                #define Acc3WordsBy2(c, d, e)   asm ("addq %5, %0; adcq %6, %1; adcq $0, %2;" : "+r"(c), "=r"(e##0), "=r"(e##1) : "1"(d##0), "2"(d##1), "r"(e##0), "r"(e##1) : "cc");</span><a name="l00122"></a>00122 <span class="preprocessor"></span><span class="preprocessor">        #endif</span><a name="l00123"></a>00123 <span class="preprocessor"></span><span class="preprocessor">        #ifndef Double3Words</span><a name="l00124"></a>00124 <span class="preprocessor"></span><span class="preprocessor">                #define Double3Words(c, d)              d##1 = 2*d##1 + (d##0&gt;&gt;(WORD_BITS-1)); d##0 = 2*d##0 + (c&gt;&gt;(WORD_BITS-1)); c *= 2;</span><a name="l00125"></a>00125 <span class="preprocessor"></span><span class="preprocessor">        #endif</span><a name="l00126"></a>00126 <span class="preprocessor"></span><span class="preprocessor">        #ifndef Acc2WordsBy2</span><a name="l00127"></a>00127 <span class="preprocessor"></span><span class="preprocessor">                #define Acc2WordsBy2(a, b)              a##0 += b##0; a##1 += a##0 &lt; b##0; a##1 += b##1;</span><a name="l00128"></a>00128 <span class="preprocessor"></span><span class="preprocessor">        #endif</span><a name="l00129"></a>00129 <span class="preprocessor"></span><span class="preprocessor">        #define AddWithCarry(u, a, b)           {word t = a+b; u##0 = t + u##1; u##1 = (t&lt;a) + (u##0&lt;t);}</span><a name="l00130"></a>00130 <span class="preprocessor"></span><span class="preprocessor">        #define SubtractWithBorrow(u, a, b)     {word t = a-b; u##0 = t - u##1; u##1 = (t&gt;a) + (u##0&gt;t);}</span><a name="l00131"></a>00131 <span class="preprocessor"></span><span class="preprocessor">        #define GetCarry(u)                                     u##1</span><a name="l00132"></a>00132 <span class="preprocessor"></span><span class="preprocessor">        #define GetBorrow(u)                            u##1</span><a name="l00133"></a>00133 <span class="preprocessor"></span><span class="preprocessor">#else</span><a name="l00134"></a>00134 <span class="preprocessor"></span><span class="preprocessor">        #define Declare2Words(x)                        dword x;</span><a name="l00135"></a>00135 <span class="preprocessor"></span><span class="preprocessor">        #if _MSC_VER &gt;= 1400 &amp;&amp; !defined(__INTEL_COMPILER)</span><a name="l00136"></a>00136 <span class="preprocessor"></span><span class="preprocessor">                #define MultiplyWords(p, a, b)          p = __emulu(a, b);</span><a name="l00137"></a>00137 <span class="preprocessor"></span><span class="preprocessor">        #else</span><a name="l00138"></a>00138 <span class="preprocessor"></span><span class="preprocessor">                #define MultiplyWords(p, a, b)          p = (dword)a*b;</span><a name="l00139"></a>00139 <span class="preprocessor"></span><span class="preprocessor">        #endif</span><a name="l00140"></a>00140 <span class="preprocessor"></span><span class="preprocessor">        #define AssignWord(a, b)                        a = b;</span><a name="l00141"></a>00141 <span class="preprocessor"></span><span class="preprocessor">        #define Add2WordsBy1(a, b, c)           a = b + c;</span><a name="l00142"></a>00142 <span class="preprocessor"></span><span class="preprocessor">        #define Acc2WordsBy2(a, b)                      a += b;</span><a name="l00143"></a>00143 <span class="preprocessor"></span><span class="preprocessor">        #define LowWord(a)                                      word(a)</span><a name="l00144"></a>00144 <span class="preprocessor"></span><span class="preprocessor">        #define HighWord(a)                                     word(a&gt;&gt;WORD_BITS)</span><a name="l00145"></a>00145 <span class="preprocessor"></span><span class="preprocessor">        #define Double3Words(c, d)                      d = 2*d + (c&gt;&gt;(WORD_BITS-1)); c *= 2;</span><a name="l00146"></a>00146 <span class="preprocessor"></span><span class="preprocessor">        #define AddWithCarry(u, a, b)           u = dword(a) + b + GetCarry(u);</span><a name="l00147"></a>00147 <span class="preprocessor"></span><span class="preprocessor">        #define SubtractWithBorrow(u, a, b)     u = dword(a) - b - GetBorrow(u);</span><a name="l00148"></a>00148 <span class="preprocessor"></span><span class="preprocessor">        #define GetCarry(u)                                     HighWord(u)</span><a name="l00149"></a>00149 <span class="preprocessor"></span><span class="preprocessor">        #define GetBorrow(u)                            word(u&gt;&gt;(WORD_BITS*2-1))</span><a name="l00150"></a>00150 <span class="preprocessor"></span><span class="preprocessor">#endif</span><a name="l00151"></a>00151 <span class="preprocessor"></span><span class="preprocessor">#ifndef MulAcc</span><a name="l00152"></a>00152 <span class="preprocessor"></span><span class="preprocessor">        #define MulAcc(c, d, a, b)                      MultiplyWords(p, a, b); Acc2WordsBy1(p, c); c = LowWord(p); Acc2WordsBy1(d, HighWord(p));</span><a name="l00153"></a>00153 <span class="preprocessor"></span><span class="preprocessor">#endif</span><a name="l00154"></a>00154 <span class="preprocessor"></span><span class="preprocessor">#ifndef Acc2WordsBy1</span><a name="l00155"></a>00155 <span class="preprocessor"></span><span class="preprocessor">        #define Acc2WordsBy1(a, b)                      Add2WordsBy1(a, a, b)</span><a name="l00156"></a>00156 <span class="preprocessor"></span><span class="preprocessor">#endif</span><a name="l00157"></a>00157 <span class="preprocessor"></span><span class="preprocessor">#ifndef Acc3WordsBy2</span><a name="l00158"></a>00158 <span class="preprocessor"></span><span class="preprocessor">        #define Acc3WordsBy2(c, d, e)           Acc2WordsBy1(e, c); c = LowWord(e); Add2WordsBy1(e, d, HighWord(e));</span><a name="l00159"></a>00159 <span class="preprocessor"></span><span class="preprocessor">#endif</span><a name="l00160"></a>00160 <span class="preprocessor"></span><a name="l00161"></a><a class="code" href="class_d_word.html">00161</a> <span class="keyword">class </span><a class="code" href="class_d_word.html">DWord</a><a name="l00162"></a>00162 {<a name="l00163"></a>00163 <span class="keyword">public</span>:<a name="l00164"></a><a class="code" href="class_d_word.html#bfd01f04e0570e990fe27e9bbdf1c6ce">00164</a>         <a class="code" href="class_d_word.html#bfd01f04e0570e990fe27e9bbdf1c6ce">DWord</a>() {}<a name="l00165"></a>00165 <a name="l00166"></a>00166 <span class="preprocessor">#ifdef CRYPTOPP_NATIVE_DWORD_AVAILABLE</span><a name="l00167"></a><a class="code" href="class_d_word.html#39aee22ff28986f7d5b3a4b1278d63c4">00167</a> <span class="preprocessor"></span>        <span class="keyword">explicit</span> <a class="code" href="class_d_word.html#bfd01f04e0570e990fe27e9bbdf1c6ce">DWord</a>(word <a class="code" href="class_d_word.html#be364d3c0509c62f464e3813e152502e">low</a>)<a name="l00168"></a>00168         {<a name="l00169"></a>00169                 <a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a> = low;<a name="l00170"></a>00170         }<a name="l00171"></a>00171 <span class="preprocessor">#else</span><a name="l00172"></a>00172 <span class="preprocessor"></span>        <span class="keyword">explicit</span> <a class="code" href="class_d_word.html#bfd01f04e0570e990fe27e9bbdf1c6ce">DWord</a>(word <a class="code" href="class_d_word.html#be364d3c0509c62f464e3813e152502e">low</a>)<a name="l00173"></a>00173         {<a name="l00174"></a>00174                 m_halfs.low = low;<a name="l00175"></a>00175                 m_halfs.high = 0;<a name="l00176"></a>00176         }<a name="l00177"></a>00177 <span class="preprocessor">#endif</span><a name="l00178"></a>00178 <span class="preprocessor"></span><a name="l00179"></a><a class="code" href="class_d_word.html#bbb0ecbdb03ece0f85fc81d0034c2804">00179</a>         <a class="code" href="class_d_word.html#bfd01f04e0570e990fe27e9bbdf1c6ce">DWord</a>(word <a class="code" href="class_d_word.html#be364d3c0509c62f464e3813e152502e">low</a>, word <a class="code" href="class_d_word.html#b961352c0156e8a803cc7f06fac36f4f">high</a>)<a name="l00180"></a>00180         {<a name="l00181"></a>00181                 m_halfs.low = low;<a name="l00182"></a>00182                 m_halfs.high = high;<a name="l00183"></a>00183         }<a name="l00184"></a>00184 <a name="l00185"></a><a class="code" href="class_d_word.html#7fb9bde7a30b7fc28a08bb2fc0fc2706">00185</a>         <span class="keyword">static</span> <a class="code" href="class_d_word.html">DWord</a> <a class="code" href="class_d_word.html#7fb9bde7a30b7fc28a08bb2fc0fc2706">Multiply</a>(word a, word b)<a name="l00186"></a>00186         {<a name="l00187"></a>00187                 <a class="code" href="class_d_word.html">DWord</a> r;<a name="l00188"></a>00188 <span class="preprocessor">                #ifdef CRYPTOPP_NATIVE_DWORD_AVAILABLE</span><a name="l00189"></a>00189 <span class="preprocessor"></span>                        r.<a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a> = (dword)a * b;<a name="l00190"></a>00190 <span class="preprocessor">                #else</span><a name="l00191"></a>00191 <span class="preprocessor"></span>                        r.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.low = _umul128(a, b, &amp;r.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.high);<a name="l00192"></a>00192 <span class="preprocessor">                #endif</span><a name="l00193"></a>00193 <span class="preprocessor"></span>                <span class="keywordflow">return</span> r;<a name="l00194"></a>00194         }<a name="l00195"></a>00195 <a name="l00196"></a><a class="code" href="class_d_word.html#4e7349021336181074857b4049ef2f3f">00196</a>         <span class="keyword">static</span> <a class="code" href="class_d_word.html">DWord</a> <a class="code" href="class_d_word.html#4e7349021336181074857b4049ef2f3f">MultiplyAndAdd</a>(word a, word b, word c)<a name="l00197"></a>00197         {<a name="l00198"></a>00198                 <a class="code" href="class_d_word.html">DWord</a> r = <a class="code" href="class_d_word.html#7fb9bde7a30b7fc28a08bb2fc0fc2706">Multiply</a>(a, b);<a name="l00199"></a>00199                 <span class="keywordflow">return</span> r += c;<a name="l00200"></a>00200         }<a name="l00201"></a>00201 <a name="l00202"></a><a class="code" href="class_d_word.html#7e2dd59548ac9f6eb3bc8f75f4a7b114">00202</a>         <a class="code" href="class_d_word.html">DWord</a> &amp; <a class="code" href="class_d_word.html#7e2dd59548ac9f6eb3bc8f75f4a7b114">operator+=</a>(word a)<a name="l00203"></a>00203         {<a name="l00204"></a>00204 <span class="preprocessor">                #ifdef CRYPTOPP_NATIVE_DWORD_AVAILABLE</span><a name="l00205"></a>00205 <span class="preprocessor"></span>                        <a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a> = <a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a> + a;<a name="l00206"></a>00206 <span class="preprocessor">                #else</span><a name="l00207"></a>00207 <span class="preprocessor"></span>                        m_halfs.low += a;<a name="l00208"></a>00208                         m_halfs.high += (m_halfs.low &lt; a);<a name="l00209"></a>00209 <span class="preprocessor">                #endif</span><a name="l00210"></a>00210 <span class="preprocessor"></span>                <span class="keywordflow">return</span> *<span class="keyword">this</span>;<a name="l00211"></a>00211         }<a name="l00212"></a>00212 <a name="l00213"></a><a class="code" href="class_d_word.html#d00fe4996c837cff9bd1f85c8bcea17b">00213</a>         <a class="code" href="class_d_word.html">DWord</a> <a class="code" href="class_d_word.html#d00fe4996c837cff9bd1f85c8bcea17b">operator+</a>(word a)<a name="l00214"></a>00214         {<a name="l00215"></a>00215                 <a class="code" href="class_d_word.html">DWord</a> r;<a name="l00216"></a>00216 <span class="preprocessor">                #ifdef CRYPTOPP_NATIVE_DWORD_AVAILABLE</span><a name="l00217"></a>00217 <span class="preprocessor"></span>                        r.<a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a> = <a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a> + a;<a name="l00218"></a>00218 <span class="preprocessor">                #else</span><a name="l00219"></a>00219 <span class="preprocessor"></span>                        r.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.low = m_halfs.low + a;<a name="l00220"></a>00220                         r.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.high = m_halfs.high + (r.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.low &lt; a);<a name="l00221"></a>00221 <span class="preprocessor">                #endif</span><a name="l00222"></a>00222 <span class="preprocessor"></span>                <span class="keywordflow">return</span> r;<a name="l00223"></a>00223         }<a name="l00224"></a>00224 <a name="l00225"></a><a class="code" href="class_d_word.html#159c633b6d08fc28b7babb58346d7a83">00225</a>         <a class="code" href="class_d_word.html">DWord</a> <a class="code" href="class_d_word.html#159c633b6d08fc28b7babb58346d7a83">operator-</a>(<a class="code" href="class_d_word.html">DWord</a> a)<a name="l00226"></a>00226         {<a name="l00227"></a>00227                 <a class="code" href="class_d_word.html">DWord</a> r;<a name="l00228"></a>00228 <span class="preprocessor">                #ifdef CRYPTOPP_NATIVE_DWORD_AVAILABLE</span><a name="l00229"></a>00229 <span class="preprocessor"></span>                        r.<a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a> = <a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a> - a.<a class="code" href="class_d_word.html#f1503dcbfece6416389ad1ff69a0c10b">m_whole</a>;<a name="l00230"></a>00230 <span class="preprocessor">                #else</span><a name="l00231"></a>00231 <span class="preprocessor"></span>                        r.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.low = m_halfs.low - a.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.low;<a name="l00232"></a>00232                         r.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.high = m_halfs.high - a.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.high - (r.<a class="code" href="class_d_word.html#a96de257ecb1953d63b2818f5711d0ee">m_halfs</a>.low &gt; m_halfs.low);<a name="l00233"></a>00233 <span class="preprocessor">                #endif</span><a name="l00234"></a>00234 <span class="preprocessor"></span>                <span class="keywordflow">return</span> r;<a name="l00235"></a>00235         }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -