ll read() {
ll x=0,f=1;
char ch=getchar();
while(ch<'0' || ch>'9') {
if(ch=='-') f=-1;
ch=getchar();
}//处理负号
while(ch>='0' && ch<='9') {
x=(x<<3LL)+(x<<1LL)+(ll)(ch^48);//x=x*10+(ch-'0')
ch=getchar();
}//处理之后的数值
return x*f;
}//读取较大数值更快,且能区分负数
......
int main(){
......
ll w=read();
......
}
这里用x=(x<<3LL)+(x<<1LL)+(ll)(ch^48);或者x=x*10+(ch-'0');都可以。
后者很明显是每次循环将x乘以10再加上新输入的数,
前者与之等价,`x<<3LL`是左移三位,相当于乘以8;`x<<1LL`是左移一位,相当于乘以2。所以,`(x<<3)+(x<<1)`其实就是8x + 2x = 10x。然后加上`(ll)(ch^48)`,这里的`ch^48`应该是将字符转换为数字,因为'0'的ASCII码是48,所以`ch-'0'`通常写法是减去48,而这里用了异或48。不过,如果ch确实是数字字符的话,`ch^48`的结果和`ch-'0'`是一样的。
结束了喵