小技巧与阅读感悟

时间:2022-03-09 22:49:23

位运算符的技巧使用

  • 来源于一段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
    }