1. 交换两个变量值的三种方法
- 申请额外的变量
int a = 10; int b = 20; int temp; //申请额外的变量temp用于交换两个变量的值 temp = a; a = b; b = temp;
- 使用加减运算
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
- 使用异或运算
上面异或不太清楚的可以参考我的博客异或的性质与应用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.取中点的方法
-
传统方法
mid = (L + R) / 2;
这种方法应该是我们小学就学过的,用第一个数(也就是最左边的数)加上最后一个数(也就是最右边的数),再用他们的和除以2,所得到的数就是中点。这种方法我们再熟悉不过了,但考虑到计算机存储的限制,如果L和R都是比较大的数,就有可能超出相应数据类型的存储范围,造成溢出。方法二便应运而生。
-
较好的方法
mid = L + (R - L) / 2;
使用这种方法,也能很好的求出中点,而且其中运算得到的数也不会超出数据范围。
-
再优化
众所周知,位运算要快于其他的运算,而除2和乘2都可以看成以为操作,于是最终,求中点的公式为:mid = L + ((R - L) >> 1);
本人系菜鸟一枚,所写文章皆为学习总结,大佬请轻喷:
谢谢阅读:,欢迎补充!