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 - 使用異或運算
上面異或不太清楚的可以參考我的博客異或的性質(zhì)與應(yīng)用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. 提取一個數(shù)最右側(cè)的1的方法
- 先給出方法
flag = num & (~num + 1); - 下面來進行分析
假設(shè)num = 11000110,
則~num = 00111001,
~num + 1 = 00111010,
則num & (~num + 1) = 00000010,
num中最右邊的1保存到了flag中,其他位為0;
3.取中點的方法
-
傳統(tǒng)方法
mid = (L + R) / 2;這種方法應(yīng)該是我們小學(xué)就學(xué)過的,用第一個數(shù)(也就是最左邊的數(shù))加上最后一個數(shù)(也就是最右邊的數(shù)),再用他們的和除以2,所得到的數(shù)就是中點。這種方法我們再熟悉不過了,但考慮到計算機存儲的限制,如果L和R都是比較大的數(shù),就有可能超出相應(yīng)數(shù)據(jù)類型的存儲范圍,造成溢出。方法二便應(yīng)運而生。
-
較好的方法
mid = L + (R - L) / 2;使用這種方法,也能很好的求出中點,而且其中運算得到的數(shù)也不會超出數(shù)據(jù)范圍。
-
再優(yōu)化
眾所周知,位運算要快于其他的運算,而除2和乘2都可以看成以為操作,于是最終,求中點的公式為:mid = L + ((R - L) >> 1);本人系菜鳥一枚,所寫文章皆為學(xué)習(xí)總結(jié),大佬請輕噴:??
謝謝閱讀:??,歡迎補充!