2013-12-16 88 views
1
inline int input() 
{ 
    int c;   
    int n = 0; 

    while ((c = getchar_unlocked()) >= '0' && c <= '9') 
    { 
     // n = 10 * n + (c - '0'); 
     n = (n << 3) + (n << 1) + c - '0'; 
    } 
    return n; 
} 

有人可以解釋如何輸入數字的這種方式工作,以及它是如何快速輸入數字?c/C++中快速輸入數字的方法?

+0

@KerrekSB:完全錯過了微觀優化機會,擺脫了循環中的兩個比較... – PlasmaHH

回答

10

編譯器通常很愚蠢,並且不瞭解您要實現的邏輯。而且,他們通常是由不太瞭解現代硬件的人所不及的。

代碼的作者已經意識到這一點,並巧妙地分析了10和8 + 2是一樣的,而8和2都是兩個冪。爲了蓬勃發展,他開始將指數的數學轉化爲本地的,按位的硬件指令。這種數學和對硬件的深刻理解的結合導致他將因子10 * x作爲8 * x + 2 * x,並且用比那些否則會發生的天真的「愚蠢乘法」更優化的指令來表達結果。當然,這樣的優化遠遠超出了任何一種技術的範圍,並且不可能自動執行。

結果是將數字乘以十的大大改進的方法。

正在申請專利。

+1

我真的不知道在哪個方向投票... – PlasmaHH

+0

@PlasmaHH:都? –

+0

請注意,此方法可以擴展爲任意整數。 – phimuemue

1

n << 3等於n * 8
n << 1等於n * 2

(n << 3) + (n << 1)等於10 * n

按位移位運算比乘法快,但我不知道這件事應該會更快。

+0

儘管在硬件級別按位移比乘法快, 'n << 3'比'n * 8'快並不一定是真的。編譯器編寫者知道如何做這種事情。 –