首页 > 编程知识 正文

左移相当于乘法还是除法,用加减法和移位实现乘法

时间:2023-05-03 07:25:01 阅读:13954 作者:2048

工作中遇到频繁操作乘法耗时太长的情况,特寻找替代方案,但实测效果不太理想,记录一段时间。

# include stdio.h # include stdlib.h # include stdint.h # include time.h # definemax _ nm (a,b ) ) a b? a: b ) #definemin_nm(a,b ) ) a b? a: b ) # define repeat _ num 100000 staticintlog2(uint 64 _ TN ); uint64_tmy_multi(uint64_tx,uint64_t y ); intmain(intargv,char** argc ) if ) argv!=3) printf (使用: exe data1 data2(n ); 返回1; }uint64_tx=atoll(argc[1]; uint64_ty=atoll(argc[2]; uint64_t result=0; clock_t start,end; int cnt=REPEAT_NUM; 开始=时钟(; wile(CNT----result=my_multi(x,y ); 结束=时钟(; printf(total_time=%.4fsn ),) double ) )结束-开始)/CLOCKS_PER_SEC ); printf(result=%lldn )、result ); getchar (; 返回0; }staticintlog2(uint64_tn ) { int result=0; if (n0x fffffff 00000000 ({ result=32; n=32; (if ) n0x00000000ffff0000 ) { result =16; n=16; (if ) n0x000000000000ff00 ) { result =8; n=8; (if ) n0x00000000000000f0 ) { result =4; n=4; (if ) n0x000000000000000c ) { result =2; n=2; (if ) n0x00000000000000002 ) { result =1; n=1; }返回结果; }uint64_tmy_multi(uint64_tx,uint64_t y ) ) uint64_ttmp_max=max_nm(x,y ); uint64_ttmp_min=min_nm(x,y ); printf('max=%lld,',tmp_max ); printf(min=%lld(n ),tmp_min ); uint64_t result=0; int logTmp=0; do{logtmp=log2(tmp_min; result=(tmp_maxlogtmp ); TMP_min-=(uint64_t )1 logTmp ); printf(logTmp=%d,tmp_min=%lldn ),logtmp,tmp_min ); }while () logtmp1) ) tmp_min 0); if(tmp_min0) result =tmp_max; 返回结果; }

原理:首先找到两个乘数(a,b )中较小的一个(例如a ),然后将其分为a=2^x 2^y .这样的格式,b*a如下:

(b x ) (b y ) )。

代码的一部分参考了这里

实际测试了多组数据,结果是ok。 如果有问题的话请留言。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。