日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hacker‘s Delight中的Trick

發布時間:2024/5/14 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hacker‘s Delight中的Trick 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Hacker’s Delight 里的各種技巧真有意思。

乘法

Chapter8,32位符號整型乘積的高32位:

int mulhs(int u, int v) {unsigned int u0, v0, w0;int u1, v1, w1, w2, t;u0 = u & 0xFFFF; u1 = u >> 16;v0 = v & 0xFFFF; v1 = v >> 16;w0 = u0*v0;t = u1*v0 + (w0 >> 16);w1 = t & 0xFFFF;w2 = t >> 16;w1 = u0*v1 + w1;return u1*v1 + w2 + (w1 >> 16); }unsigned int mulhs(unsigned int u, unsigned int v) {unsigned int u0, v0, w0;unsigned int u1, v1, w1, w2, t;u0 = u & 0xFFFF; u1 = u >> 16;v0 = v & 0xFFFF; v1 = v >> 16;w0 = u0*v0;t = u1*v0 + (w0 >> 16);w1 = t & 0xFFFF;w2 = t >> 16;w1 = u0*v1 + w1;return u1*v1 + w2 + (w1 >> 16); }

拼湊一下可以算出完整的64位乘積:

long long int mul32(int u, int v) {int h = mulhs(u, v);int l = u * v;return ((long long int)h << 32 | l); }long long unsigned int mul32(unsigned int u, unsigned int v) {unsigned int h = mulhs(u, v);unsigned int l = u * v;return ((long long unsigned int)h << 32 | l); }

后面的習題提到低32位的運算用有符號或者無符號都是相同的,測試了一下確實如此。

for a 32×32 ? 64 bit multiplication, the low-order 32 bits of the product are the same whether the operands are interpreted as signed or unsigned integers.

這種把長位寬的運算拆成高低兩部分分別計算的方法,在用SIMD做優化的時候可能會有用,因為一些SIMD指令集并沒有現成的長位寬運算指令,只好自行拼湊了。

總結

以上是生活随笔為你收集整理的Hacker‘s Delight中的Trick的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。