我并不了解編譯器內(nèi)部怎樣運(yùn)作该肴,但如果編譯器不做的話盏浇,有些優(yōu)化就需要程序員有所考量!
如果我們要算一個(gè) y=x^13
我們?nèi)绻@接算蚀瘸,就需要12次乘法運(yùn)算狡蝶,如果是浮點(diǎn)數(shù),那開(kāi)銷很大贮勃。
我們這樣做 y=x13=x8 * x^4 * x
t1=x^2
t2=t1^2
t3=t2^2
y=t3t2x
這樣總共5次乘法
再來(lái)個(gè)例子 y=x^27
需要26次乘法運(yùn)算贪惹,顯然這不是我們需要的結(jié)果。
改成這樣
y= ((x3)3)^3
只需要6次乘法就得到結(jié)果寂嘉,計(jì)算機(jī)顯然更喜歡這樣奏瞬。
現(xiàn)在,我們來(lái)抽象一下我們的算法
int iexp(int x, unsigned n) {
int p, y;
y = 1; // Initialize result
p = x; // and p.
while(1) {
if (n & 1) y = p*y; // If n is odd, mult by p.
n = n >> 1; // Position next bit of n.
if (n == 0) return y; // If no more bits in n.
p = p*p; // Power for next bit of n.
}
}