因為工作中遇到頻繁操作乘法運算導致用時過多的情況,特找了下替代方案,但實測效果並不理想,暫做記錄。
#include #include #include #include #define max_nm(a,b) (a > b? a: b)
#define min_nm(a,b) (a < b? a: b)
#define repeat_num 100000
static int log2(uint64_t n);
uint64_t my_multi(uint64_t x, uint64_t y);
int main(int ar**, char** argc)
uint64_t x = atoll(argc[1]);
uint64_t y = atoll(argc[2]);
uint64_t result = 0;
clock_t start, end;
int cnt = repeat_num;
start = clock();
while(cnt --)
result = my_multi(x, y);
end = clock();
printf("total_time = %.4f s\n", (double)(end - start) / clocks_per_sec);
printf("result = %lld\n", result);
getchar();
return 0;}
static int log2(uint64_t n)
if (n & 0x00000000ffff0000)
if (n & 0x000000000000ff00)
if (n & 0x00000000000000f0)
if (n & 0x000000000000000c)
if (n & 0x0000000000000002)
return result;}
uint64_t my_multi(uint64_t x, uint64_t y)
while ((logtmp > 1)&&(tmp_min > 0));
if (tmp_min > 0)
result += tmp_max;
return result;
}
原理:先找出兩個乘數(a,b)中較小的那個(如 a),將其拆分成 a = 2^x + 2^y + ... 這類格式,則 b*a 等效於:
(b << x) + (b << y) + ....
部分**參考了這裡
巧用移位運算避免乘法運算
使用移位運算來避免乘法運算是一種常用技巧,不過乘數必須都是正整數,而且必須至少有 乙個是 2 的 n 次方,例如 2,4,8,16,32 移位運算的特點是速度快,而乘法運算速度較慢,把乘法運算轉化為移位運算可以稍微提高程式執行效率。例如 num 32 等同於num 5 2 的 5 次方等於 32 如...
優化飽和加法運算
通常計算機上的加法運算是迴圈的,例如0x0001 0x7fff 0x8000,其中0x7fff是short型別的最大正值,0x8000是最小負值。假設我們是把兩個聲音相加,由於結果的符號反轉,將出現不連續,如果我們把上面的數當做q15定點小數來看的話,本來是正1 0x7fff 由於加了個很小的數 0...
移位,邏輯運算實現加法,乘法和除法
1 用邏輯運算實現加法 兩個正整數相加,如果使用移位操作符和邏輯運算 與 運算,適用於對應位相同的加法,如x 3 0011 y 3 0011 則x y 0011 x y 2 異或運算,適用於對應位不同的加法,如x 3 0011 y 3 則x y 0 故 對於二進位制加法 類似每一位的異或運算結果,只...