用位运算和算术运算将字符串转换为数字 喵喵喵

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'`是一样的。

结束了喵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值