1. 交换两个变量值的三种方法

  1. 申请额外的变量
    int a = 10;
    int b = 20;
    int temp;	//申请额外的变量temp用于交换两个变量的值
    temp = a;
    a = b;
    b = temp;
    
  2. 使用加减运算
    int a = 10;
    int b = 20;
    a = a + b;	//a = 10 + 20	b = 20
    b = a - b;	//a = 10 + 20	b = 10 + 20 - 20 = 10
    a = a - b;	//a = 10 + 20 - 10	 = 20	b = 10
    
  3. 使用异或运算
    int a = 10;
    int b = 20;
    a = a ^ b;	//a = a ^ b	b = b
    b = a ^ b;	//a = a ^ b	b = a ^ b ^ b = a
    a = a ^ b;	//a = a ^ b ^ a = b	b = a
    
    上面异或不太清楚的可以参考我的博客异或的性质与应用

2. 提取一个数最右侧的1的方法

  • 先给出方法
    flag = num & (~num + 1);
    
  • 下面来进行分析
    假设num = 11000110
    ~num = 00111001
    ~num + 1 = 00111010
    num & (~num + 1) = 00000010,
    num中最右边的1保存到了flag中,其他位为0;

3.取中点的方法

  1. 传统方法

    mid = (L + R) / 2;
    

    这种方法应该是我们小学就学过的,用第一个数(也就是最左边的数)加上最后一个数(也就是最右边的数),再用他们的和除以2,所得到的数就是中点。这种方法我们再熟悉不过了,但考虑到计算机存储的限制,如果L和R都是比较大的数,就有可能超出相应数据类型的存储范围,造成溢出。方法二便应运而生。

  2. 较好的方法

    mid = L + (R - L) / 2;
    

    使用这种方法,也能很好的求出中点,而且其中运算得到的数也不会超出数据范围。

  3. 再优化
    众所周知,位运算要快于其他的运算,而除2和乘2都可以看成以为操作,于是最终,求中点的公式为:

    mid = L + ((R - L) >> 1);
    

    本人系菜鸟一枚,所写文章皆为学习总结,大佬请轻喷😱
    谢谢阅读😘,欢迎补充!

posted on 2019-11-07 19:45  Staick  阅读(97)  评论(0编辑  收藏  举报