一、背景
一些题目需要读入大量数据,并且卡时间的情况下,传统scanf和cin会有点捉襟见肘,在这千钧一发,九死一生的情况下,快读看起来顿时顺眼多了(可以不用,但不能没有系列)
二、模板
#include<bits/stdc++.h>
using namespace std;
//#define mod 10000007 //取模数据,一般大数据题目会做要求
inline int read()//内联函数多用于函数体代码精简且需要多次调用的情况
{
register int x=0,f=1;//x是数值,f是符号
register char ch=getchar();//将值存入寄存器,加快调用速度
while(ch<'0'||ch>'9')//将空格、换行与符号滤去
{
if(ch=='-')//出现负号表示是负数
{
f=-1;
}
ch=getchar();//继续读入
}
while(ch>='0'&&ch<='9')//循环读取每一位的数字
{
x=(x<<1)+(x<<3)+(ch^48);//累加结果,位运算加速
//x%=mod;
ch=getchar();
}
return x*f;//乘上符号
}
int main()
{
int a=read();
cout<<a;
return 0;
}
1.
x=(x<<1)+(x<<3)+(ch^48);
此处使用位运算,>>x是把这个二进制数向右平移x位,挤出去的扔掉 ,<<x就是把这个二进制数向左平移x位,空位以0补齐,所以
x<<n相当于x*=2n,
这里的(x<<3)+(x<<1)相当于
x*23+x*21,
=x*(8+2)
=x*10
2.
c^48是“异或运算”
即二进制对应位置不同时该位为1,否则为0
即判断对应数位是否不同
如
1 0 0 1 0 1 1 0 与
1 1 0 0 1 1 0 1 两数运算结果为
0 1 0 1 1 0 1 1,
因其算法具体为0^0=0,0^1=1,1^0=1,1^1=0
像是二进制的加法,但没有进位,所以被称作(二进制)不进位加法
这里的c^48则是特殊情况,因为‘0’=48,而48=(110000)2
众所周知,后面四位能表示的最大十进制整数为15,故表示ACSII码中的10个数字绰绰有余
并且因为48-57中,二进制形式其第五第六位皆为1,所以进行异或运算时会被算为0,即48-57中每个数由于都含有这两位数,都减去了48,而48的后面4位全是0,故49-57的数与48的差异能且仅能在后四位体现,从48-57,后四位恰好组成0-9,且一一对应,故可用^运算来进行数字的ASCII码转换。
这里加上c^48等同于将此字符所代表数字做个位加进去。
转载于:https://www.cnblogs.com/648-233/p/10675983.html