c语言里面,对于unsigned short i;代码“i%=33”怎么用位移来代替呢,是为了优化程序效率才被迫这样的。

李嘉图 发布于 2014/06/05 10:17
阅读 348
收藏 2
就是需要优化,一次少几个毫秒,次数多了,也能见效。
加载中
0
Zirconi
Zirconi
感觉没用,即使换成位移也不见得有什么提升。
李嘉图
李嘉图
是呀,快了个、几个cpu周期,你看不出来,可以1W次,10W次,一亿次不就出来了。快了就是好。
0
ericsoul
ericsoul
求模不是很记得了。感觉可以从i%(32+1)入手。看看求模的一些运算法则吧。不过我是瞎蒙的。
ericsoul
ericsoul
呃i&31,写错
ericsoul
ericsoul
呃,看了下,模数不能分解,被模数可以分解。我这个思路不行。我有这个想法的念头和楼下的i%32=i&32一样。哈哈要握个爪。
0
魔神翼
魔神翼
楼主简直是丧心病狂!我不信这是最后一个可以优化的地方
李嘉图
李嘉图
这样的一个求余,少则千亿次,多则万亿,十万亿次,其余的都是判断相等的逻辑运算和一些简单的赋值运算,你就知道我为什么想用位移了。
李嘉图
李嘉图
我还想用汇编嵌套呢,核心代码必须是高效的。
0
realanan
realanan
i%=32可以用i&31代替,33就苦手了
0
c
cloudcheng
围观高手的解决办法,看来做C的高手还有蛮多。
0
e
eviking
i&=32;i-=1; 满足你要求吗?
e
eviking
哎呀,小于32时出错了。
0
徐永强
徐永强
楼主初始化个64kB的全局常量数组吧。
0
ericsoul
ericsoul
我可能想到了,i是short int所以是8位是吧,33是00100001,01100011%00100001=0,01100100%00100001=1对吧。所以i的后5位减去i左补0右移5位就是模。
李嘉图
李嘉图
回复 @ericsoul : 在我的机器上,使用了sizeof(unsigned short)后,显示是2,也就是16位,看你想了不少,谢谢你了。
ericsoul
ericsoul
从左边开始遇到1就把这位置0,并且计数5次左移之后还要减一,最后剩下<33了就是模了。好像会出现不够减的情况。
ericsoul
ericsoul
呃,还要考虑,后五位比前面小的情况。我勒个去的。
ericsoul
ericsoul
呃,short好像是16bit?呃,那好像不行,不过在10位以内是没问题的超过10位的好像要再想想,不过感觉思路是对的。
返回顶部
顶部