通過位運算計算int的加減乘除:
加法原理:a+b
位的異或運算跟求'和'的結果一致:
異或 1^1=0 1^0=1 0^0=0
求和 1+1=0 1+0=1 0+0=0
位的與運算跟求'進位‘的結果一致:
位與 1&1=1 1&0=0 0&0=0
進位 1+1=1 1+0=0 0+0=0
所以a+b = (a^b)+((a&b)<<1)
減法原理:a-b
減去一個正數等於加上這個負數的補碼.一個正數的補碼是它的原碼.一個負數的補碼等於它的反碼+1.即 -b = ~b+1.所以a-b = a+(-b) = a+ ~b+1.
補碼的規定如下:
對正數來說,最高位爲0,其餘各位代表數值本身(以二進制表示),如+42的補碼爲00101010。
對負數而言,把該數絕對值的補碼按位取反,然後對整個數加1,即得該數的補碼。如-42的補碼爲11010110(00101010按位取反11010101+1即11010110)
【例1】對 5 進行取反。
假設爲16位。
5轉換爲二進制數爲: 0000 0000 0000 0101得到二進制數
每一位取反: 1111 1111 1111 1010得到最終結果的補碼
取補碼: 1000 0000 0000 0110得到最終結果的原碼
轉換爲十進制數:-6
則 5 取反爲 -6 .
【例2】對 -5 進行取反。
假設爲16位。
-5 轉換爲二進制數爲: 1000 0000 0000 0101得到二進制數
取補碼: 1111 1111 1111 1011得到二進制數的補碼
每一位取反: 0000 0000 0000 0100 得到最終結果的補碼
取補碼: 0000 0000 0000 0100得到最終結果的原碼
轉換爲十進制數:4
則 -5 取反爲 4 .
如果用適合人類運算的計算方法:
如對 a 按位取反,則得到的結果爲 -(a+1) .
此條運算方式對正數負數和零都適用。
所以~(b-1)=-b可得a-b=a+(-b)=a+(~(b-1))。把減法轉化爲加法即可。
乘法原理:a*b
1.用循環加法替代乘法。a*b,就是把a累加b次。時間複雜度爲O(N)。
2.在二進制數上做乘法.就是根據乘數的每一位爲0或1時,將被乘數錯位的加在積上。時間複雜度爲O(logN)
除法原理:a/b
1.從被除數上減去除數,看能減多少次之後變得不夠減。時間複雜度爲O(N)。
2.採用類似二分法的思路,從除數*最大倍數開始測試,如果比被除數小,則要減去。下一回讓除數的倍數減少爲上一次倍數的一半,這樣的直到倍數爲1時,就能把被除數中所有的除數減去,並得到商。時間複雜度降低到O(logN)。
/**
* 加法
* @param a
* @param b
* @return
*/
public static int add(int a,int b) {
int res=a;
int xor=a^b;//得到原位和
int forward=(a&b)<<1;//得到進位和
if(forward!=0){//若進位和不爲0,則遞歸求原位和+進位和
res=add(xor, forward);
}else{
res=xor;//若進位和爲0,則此時原位和爲所求和
}
return res;
}
/**
* 減法
* @param a
* @param b
* @return
*/
public static int minus(int a,int b) {
int B=~(b-1);
return add(a, B);
}
/**
* 乘法
* @param a
* @param b
* @return
*/
public static int multi(int a,int b){
int i=0;
int res=0;
while(b!=0){//乘數爲0則結束
//處理乘數當前位
if((b&1)==1){
res+=(a<<i);
b=b>>1;
++i;//i記錄當前位是第幾位
}else{
b=b>>1;
++i;
}
}
return res;
}
/**
* 除法
* @param a
* @param b
* @return
*/
public static int sub(int a,int b) {
int res=-1;
if(a<b){
return 0;
}else{
res=sub(minus(a, b), b)+1;
}
return res;
}
public static void main(String[] args) {
//加法運算
int result1 = add(90,323);
System.out.println(result1);
//減法運算
int result2 = minus(413,323);
System.out.println(result2);
int result3 = multi(90,2);
System.out.println(result3);
int result4 = sub(90,2);
System.out.println(result4);
}