位運算-實現加減乘除
阿新 • • 發佈:2019-01-10
res oid font ont 分享圖片 != family highlight args
基本性質:1:~n=-(n+1),比如:~3=-4
2:獲取整數n的二進制串中最後一個1:-n&n=~(n-1)&n
3:去掉整數n的二進制串中最後一個1:n&(n-1)
加法:(以下所有代碼都是Java實現)
public static int add(int a,int b) { int res=a; int xor=a^b; // a^b得到原位和(相當於按位相加沒有進位) int forward=(a&b)<<1;//得到進位和 a&b:得到產生進位的地方 (a&b)<<1:進位後的值 if(forward!=0){//若進位和不為0,則遞歸求原位和+進位和 res=add(xor, forward); }else{ res=xor;//若進位和為0,則此時原位和為所求和 } return res; }
減法:
public static int minus(int a,int b) { int B=~(b-1); // 由上面基本性質 -b=+(-b),~(b-1)=-b ===>>> a-b=a+(-b)=a+(~(b-1) return add(a, B); }
乘法:
public static int multi(int a,int b){ /* 1011 * 1010 -------- 10110 (1011<<1,相當於乘以0010) 1011000 (1011<<3,相當於乘以1000) -------- 1101110 */ 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; }
除法:
public static int sub(int a,int b) { // 除法的意義就在於:求a可以由多少個b組成。那麽由此我們可得除法的實現:求a能減去多少個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[]){ System.out.println("加法測試:"+add(10, 5)); System.out.println("減法測試:"+minus(10, 5)); System.out.println("乘法測試:"+multi(10, 5)); System.out.println("除法測試:"+sub(10, 5)); }
測試結果:
位運算-實現加減乘除