使用移位和加法運算替代乘法運算

2021-10-18 23:17:20 字數 1318 閱讀 3565

因為工作中遇到頻繁操作乘法運算導致用時過多的情況,特找了下替代方案,但實測效果並不理想,暫做記錄。

#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 故 對於二進位制加法 類似每一位的異或運算結果,只...