2013-10-28 150 views
4

我已經瞭解到使用getchar_unlocked是快速讀取輸入的方式。我已經看到了許多地方的代碼閱讀,但無法理解。任何人都可以請幫我理解如何閱讀getchar_unlocked? 在此先感謝。使用getchar_unlocked()讀取輸入()

void scanint(int &x) 
{ 
register int c = getchar_unlocked(); 
x = 0; 
for(;(c<48 || c>57);c = getchar_unlocked()) 
    ; 
for(;c>47 && c<58;c = getchar_unlocked()) 
{ 
    x = (x<<1) + (x<<3) + c - 48; 
} 
} 

我也見過很多其他的代碼。我沒有特別明白轉移號碼的目的。任何有關的幫助表示讚賞

+0

使用'(c&15)'而不是'c-48'可以更快。 –

回答

1

getchar_unlocked()就像getchar()除了它不檢查多線程鎖定。

所以,它速度更快,但它不是線程安全的。

0

我想你可能對getchar_unlocked()的目的有錯誤的想法。真。

從人類用戶那裏做單字符I/O時,很難相信你需要專注於「快速」,因爲人類會很慢。

您包含的功能看起來像是使用getchar_fast()讀取一個整數,並且以非常糟糕的風格編寫。它看起來似乎不是解決任何問題的一部分。它在處理指針變量x時也完全失敗。

總之,你的問題不是很清楚。

+0

是的,它是讀取整數。我也看到了許多其他代碼。我沒有特別明白轉移號碼的目的。任何有關的幫助表示讚賞。 你可以給一個getchar_fast的想法。從未聽說過它。 –

+1

你的回答是錯誤的。我在這裏有兩節課。首先 - 數學:轉變有其目的。它快速乘以10:x * 10 = x *(2 + 8)= 2 * x + 8 * x =(x << 1)+(x << 3)。第2課 - 計算機使用:標準輸入並不意味着「從鍵盤輸入」。它可能是從我們的流程中傳送的一些TB數據文件。仍然無需擔心I/O性能? –

+1

@TomaszGandor如果你的目標是快速輸入TB數據,我真的不認爲你想要爲每個字符做一個函數調用,沒有。而且我也認爲減少強度的乘法對於任何現代計算機來說都不是很重要。整數乘法很便宜。如果不是,那麼這是優化器的工作。 – unwind

4

getch_lock一次讀取一個字符。在給定的代碼中,我們試圖讀取一個整數。第一個for循環的目的是讀取數字字符,如果有的話忽略它。第二個for循環讀取必須是數字的字符並執行
n=n*10+c
由於C在Ascii中,所以我們減去了48即Ascii代碼'0'。使用代碼更快而不是使用乘法移位。
n*10=n*(8+2)=n*8+n*2=n<<3+n<<1