x >> y 表示x/(2的y次方)
x << y 表示x*(2的y次方)
10 & 3 可以看作 1010 & 0011 每位做与运算 结果为0010=2
10 | 3 可以看作 1010 | 0011 每位做或运算 结果为1011=11
这里说明 位运算是 优于 求余运算的
可是在测试的时候可能会发现二者运算时间差的不是很大,只有很小的时间差
这是因为编译器在对2的指数取模操作的时候,会优化成位运算操作,所以有时二者差距很小
知道了这些就开始优化我们的代码了
最开始判断奇数:
bool judge(int x){
if(x%2==0)return 0;
else return 1;
}
然后我们会优化一下布尔表达式:
bool judge(int x){
return x%2 != 0; (如果写成x%2==1 还要增加负数判定条件,所以这里直接写成判偶数)
}
在把取模转换成位运算:
bool judge(int x){
return x >> 1 << 1 != x; (整数奇数除2会丢失小数位 所以除2再乘2和原来的结果不同)
}
最后可以写成这样:
bool judge(int x){
return (x & 1) == 1;
}
就大功告成了!
在这里记录学习过程
有什么错误还请大佬指出!!