C++的卡常技巧

发布时间:2026/7/28 16:48:57
C++的卡常技巧 C的一系列卡常技巧register 的运用register 相当于一种“暗示”它暗示你的内存cache这个变量将会频繁使用使得你的cache存下该变量以便直接调用常用于各种循环中如for(registerinti1;in;i){}i与i在分别进行两种操作时,不同于ii将会先把i的值在内存中存下再运用一般花费时间是i的1.5倍左右常用于循环(据说现在不少编译器已经将此优化如for(inti1;in;i){}inline原理类似register,用于非递归函数多次调用下时间节省非常可观如inlineboolcheck(intmid){if(a[mid]ans)returntrue;elsereturnfalse;}位运算位运算一般来说包括但不限于以下几种① (与 两数二进制下各位同时为1取1否则取0如5755的二进制为1017的二进制位111结果为101再转为十进制 返回5②|(或) 两数二进制下各位有至少一位为1时取1否则取0如8|4128的二进制为10004的二进制为0100缺位补0 结果为1100转为十进制 返回12③^异或两数二进制下各位相同时取0不相同则取1如9^4139的二进制为10014的二进制为0100结果为1101转为十进制 返回13④j(进位) 将一个数二进制下所有数都向高位挪移j位,相当于乘以2j如 316,3212⑤j(退位) 将一个数二进制下所有数都向低位挪移j位,与进位相反(向0取整⑥~ (取反)将一个数二进制下所有数取反,即0变1,1变0.以上仅适用于整数注意位运算的优先级很低略大于赋值和逗号进一步优化位运算相对于整数运算是很快的,也就是说,如果某些运算可以由位运算代替,你的程序就会快很多如i,你可以把它改写为i-~i;如for(inti1;in;i-~i){}如判断一个数的奇偶性,你原来可能是这样写的if(i%20)printf(偶数);elseprintf(奇数);但学了位运算之后你可以这样if(ii)printf(奇数);elseprintf(偶数);你想到了吗?在保证程序正确的情况下少用括号括号对于理解代码很有帮助,对于代码速度虽然影响不大,但也有负担,所以如果可以少打括号,就少打一点吧注意以下情况位运算 宏展开 其他优先度较低的运算等读写优化cin,cout一般慢于scanf,printfprintf慢于put puts putcharscanf慢于getchar快读模板inlineintread(){intx,f1;charchgetchar();while(ch0||ch9){if(ch-){f-1;}chgetchar();}while(ch0ch9){x(x3)(x1)ch-0;chgetchar();}returnx*f;}快写模板inlinevoidprint(intx){intot;while(x){otx%10;putchar(ot0);x/10;}return;}(待续)