6

我了解到使用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;
 }
}

我也看过很多其他的代码。我不是特别明白转移号码的目的。对此的任何帮助表示赞赏

4

3 回答 3

5

getch_lock一次读取一个字符。在给定的代码中,我们试图读取一个整数。第一个for循环的目的是读取存在的数字字符并忽略它。第二个for循环读取一个必须是数字的字符并执行
n=n*10+c
As C is in Ascii,我们减去了 48 即 Ascii 代码'0'。为了使代码更快,而不是使用乘法移位。
n*10=n*(8+2)=n*8+n*2=n<<3+n<<1

于 2014-03-10T09:17:17.240 回答
1

getchar_unlocked()就像getchar()它不检查多线程锁。

所以,它更快,但它不是线程安全的。

于 2013-10-28T09:08:28.233 回答
0

我认为您可能对getchar_unlocked(). 真的。

从人类用户处执行单字符 I/O 时,很难相信您需要专注于“快速”,因为人类会非常慢。

您包含的函数看起来像是在使用 读取整数getchar_fast(),并且以非常糟糕的风格编写。它当然看起来不像是任何特定问题的解决方案的一部分。它在处理x指针变量时也完全被破坏了。

总之,你的问题不是很清楚。

于 2013-10-28T09:09:16.040 回答