不用加減乘除做運算

1、一個數擴大n倍

直接用移位,擴大n倍相當於是原來的(n+1)倍,例擴大7倍,則是原來的8倍,那就左移3位

2、不使用新的變量,交換兩個變量的值

  用異或運算 a=a^b;b=a^b;a=a^b;

3、求兩個整數之和

對數字做運算,除了四則運算之外,也就只剩下位運算了。位運算是針對二進制的,我們就以二進制再來分析一下前面的三步走策略對二進制是不是也適用。
5的二進制是101,17的二進制是10001。還是試着把計算分成三步:第一步各位相加但不計進位得到的結果是10100(最後一位兩個數都是1,相加的結果是二進制的10。這一步不計進位,因此結果仍然是0;第二步記下進位。在這個例子中只在最後一位相加時產生一個進位,結果是二進制的10;第三步把前兩步的結果相加,得到的結果是10110,轉換成十進制正好是22。由此可見三步走的策略對二進制也是適用的。
接下來我們試着把二進制的加法用位運算來替代。第一步不考慮進位對每一位相加。0加0、1加1的都0,0加1、1加0的結果都是1。我們注意到,這和異或的結果是一樣的。對異或而言,00、1和1異或的結果是0,而0和1、l和0的異或結果是1。接着考慮第二步進位,對0加0、0加1、1加0而,都會產生進位,只有1加1時,會向前產生一個進位。此時我們可以想象成是兩個數先做位與運算然後再向左移動一位。只有兩個數都是1的時候,位與得到的結果是1,其餘都是0。第三步把前兩個步驟的結果相加。第三步相加的過程依然是重複前面兩步,直到不產生進位爲止。

僞代碼:

int a=7;
   int b=9;
   int sum;
   do{
       sum=a^b;
       b=(a&b)<<1;
       a=sum;
   }while (b!=0);
   System.out.println(a);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章