我了解到使用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 :(得分:5)
getch_lock
一次读取一个字符。在给定的代码中,我们试图读取一个整数。第一个for
循环的目的是读取数字字符(如果存在)并忽略它。第二个for
循环读取一个必须为数字并执行
的字符
n=n*10+c
由于C在Ascii中,我们减去了48,即'0'
的Ascii代码。为了使代码更快而不是使用乘法移位
n*10=n*(8+2)=n*8+n*2=n<<3+n<<1
答案 1 :(得分:1)
getchar_unlocked()
与getchar()
类似,不同之处在于它不检查多线程锁。
所以,它更快,但它不是线程安全的。
答案 2 :(得分:0)
我认为你可能对getchar_unlocked()
的目的有错误的想法。真。
当从人类用户进行单字符I / O时,很难相信你需要专注于“快速”,因为人类会非常慢。
你包含的函数看起来像是使用getchar_fast()
读取整数,并且以非常可怕的风格编写。它当然不像是任何特定解决方案的一部分。在处理x
指针变量时,它也完全被打破了。
简而言之,您的问题不是很明确。