【快读优化】思路及模板

一、背景

        一些题目需要读入大量数据,并且卡时间的情况下,传统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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值