C++中的快读和快写

快读原理

单个字符的读入速度要比读入数字快,因此我们以字符的形式先读入,然后处理计算转为数字。

代码

inline int read(){
    register int x = 0, t = 1;
    register char ch=getchar(); // 读入单个字符到寄存器
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            t=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);  // 移位与异或
      	// 第十行可以换成 x = x * 10 + ch - '0'
        ch=getchar();
    }
    return x*t;
}

其中涉及到的移位运算、异或、inline、register

位运算、寄存器涉及计算机组成原理

第十行 x=(x<<1)+(x<<3)+(ch^48); 其中 << 为移位 ^ 为异或

移位

简单来说移位就是二进制数左移(<<) 或 右移(>>) x位 十进制看来就是乘/除2

其中 x << 1 == x * 2; x << 3 == x * 2 * 2 * 2; 二者相加也就是 x * 10;

位或

就是数学里次方的符号 ^ 也是format中格式居中对齐的符号表示

简单说就是 "同0 异1" 相同的两个数异或为0 不同的异或为1

ch^48 相当于 ch -= '0'

inline

简单来说就是类似 #define 但是能更进一步的定义函数 能够提升效率

register

意思是将变量放入寄存器,大幅提升效率

注意 : 读入中包含大量无用空格时 快读不太适用

附 快写代码

inline void write(int x)
{
    if(x<0){
    	putchar('-');
		x=-x;
	}
    if(x>9) 
		write(x/10);
    putchar(x%10+'0');
}
posted @ 2020-04-11 16:55  CoderZjz  阅读(5758)  评论(2编辑  收藏  举报