如果(max-min)<(INT_MAX/127)
那么你可以naivly将/127
东西之前乘(max-min)*input
,你必须为了避免溢出和不确定的行为分解操作...
在后一种情况下,一个天真的可能性是通过127.
A=Q1*127+R1
B=Q2*127+R2
A*B = (Q1*Q2*127 + Q1*R2 + Q2*R1) * 127 + R1*R2
(A*B)/127 = Q1*Q2*127 + Q1*R2 + Q2*R1 + (R1*R2/127)
或用C来划分两个乘法器:
unsigned int range=max-min;
unsigned int output = min
+ (range/127)*(input/127)*127
+ (range/127)*(input%127)
+ (range%127)*(input/127)
+ (range%127)*(input%127)/127;
这是相当肯定有与位移>>8
,编译器可能已经把它做好更有效的提法,但也许不那么好,我们可以更好地帮助他:
A=Q1*128+R1
B= 0*128+R2 (because B<=127)
A*B = (Q1*R2) * (127+1) + R1*R2
(A*B)/127 = Q1*R2 + (Q1*R2 + R1*R2)/127
,并在C:
编辑
咳咳,我的意图是通过128来划分,即>> 7,我写错>> 8相同的余数应为& 0x7F的不& 0xFF的
这当然最好少晦涩和公正写/ 128和%128因为我们可以相信,编译器把这些OPS成简单的位OPS时下...
unsigned int range=max-min;
unsigned int high=(range/128)*input;
unsigned int low =(range % 128)*input;
unsigned int output = min + high + (high+low)/127;
EDIT2
为了平衡分布的更好一点,我们可能会采用某种形式的舍入,而不是像这样截断:
unsigned int output = min + high + (high+low+63)/127;
你的整数有多大? “max - min”最高值是多少? –
如果可能,请尝试使用更新的SDCC。最新版本是3.3.0和3.4.0。即将到来。自2.8.0以来,SDCC有了很大提高。 –