Hacker‘s Delight中的Trick
生活随笔
收集整理的這篇文章主要介紹了
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: icp许可证一般是在哪个政府部门办理
- 下一篇: 代码模板