位运算符的技巧使用
- 来源于一段20行的贪吃蛇代码,使用 ~~去除了小数部分,~是取反,两次 ~~ 就是取回原来,但是~的前提是只对整数有效果,所以利用这个特性去除掉了小数
- 来源于leetcode中singleNumber , 在一堆 偶数 数字中找到奇数次数的数字 两次 ^^ 异或操作就可以达到效果 原因是 A^A = 0 所以所有偶数个数的元素都被消去了,最后剩下的数字就是奇数次数的数字
- 来源于阅读,在进行奇偶数判断的时候,使用与运算判断最后一位即可判断奇偶数,例如 a & 1 == 0 ,判断是否是偶数,同样 a & 1 ==1,判断是否是奇数。
- 来源于java HashMap的hash计算源码,进行(2^n)的数的取模运算时,例如 a % b ,其中(b = 2^n),此时可以使用 a & (b - 1),同样对于(2^n)的乘法或者除法运算,使用
<<
和>>
移位进行操作
- 承接上一条,注意在java中 % 代表取余 , 想要使用模运算,可以调用Math.floorMod 方法,直译是地板取余,意思就是一直往下取,也就是说商是偏向于负无穷的。
- 承接上一条,对于取余和取模的区别,取余数的商在近似的时候是偏向于0的,例如 9 / -4 =商为 -2.25,取余的话会把商往0这个方向舍,因此是-2,那么余数就是
9 - (-4)*(-2) = 1
,对于取模来说,会将商往无穷小的方向舍,因此是-3,那么余数就是9 - (-4)*(-3) = 3
- 使用取反运算符拿到相反数,
~x + 1
即可
- 使用异或运算进行swap操作,无需使用中间变量,仅限数值型
void swap(int a,int b){
a ^= b; // a = a ^ b
b ^= a; // b = b ^ a ^ b = a
a ^= b; // a = a ^ b ^ a = b
}
- 位运算用于乘法和除法效果十分明显,所以不要涉及到加减的时候不要一味的使用,得不偿失,并且使用位运算的时候最好加上一行注释,免得浪费他人时间
关于重构
- 来源于忘记了在哪看见的了,不要瞎鸡儿重构,要先分析代码影响性能的比例,如果一段10%的代码影响了90%的系统性能,那你花再长时间去优化那剩下的90% 的代码都是浪费时间
- 来源于上一条 , 合理的使用枚举类去代替那些状态值的判断,比如返回给前端的状态码,用枚举就很适合
public enum HttpResponseCodes {
OK(200),
FORBIDDEN(403),
NOT_FOUND(404);
private final int code;
HttpResponseCodes(int code) {
this.code = code;
}
public int getCode() {
return code;
}
public boolean isSuccess() {
return code >= 200 && code < 300;
}
}
if (getHttpResponse().getStatusCode().isSuccess()) {
// Do something if the response code is a success code
}