java实现三位数加减乘除_用Java位运算实现加减乘除四则运算
感謝博客:http://blog.csdn.net/itismelzp/article/details/49621741? 提供的思路。
要用位運算來實現(xiàn)四則運算,不僅僅要知道&,|,~,^,<>怎么做,還需要先掌握位運算的幾個運算規(guī)律:
1:~n=-(n+1),比如:~3=-4
2:獲取整數(shù)n的二進制串中最后一個1:-n&n=~(n-1)&n
3:去掉整數(shù)n的二進制串中最后一個1:n&(n-1)。
然后,我們就可以使用常規(guī)位運算并結(jié)合上面的運算規(guī)律來實現(xiàn)四則運算了。
加法:a+b
由a^b可得按位相加后沒有進位的和;
由a&b可得可以產(chǎn)生進位的地方;
由(a&b)<<1得到進位后的值。
那么? 按位相加后原位和+進位和? 就是加法的和了,而? a^b +? (a&b)<<1? 相當于把? +? 兩邊再代入上述三步進行加法計算。直到進位和為0說明沒有進位了則此時原位和即所求和。
public int add(int a,intb) {int res=a;int xor=a^b;//得到原位和int forward=(a&b)<<1;//得到進位和if(forward!=0){//若進位和不為0,則遞歸求原位和+進位和
res=add(xor, forward);
}else{
res=xor;//若進位和為0,則此時原位和為所求和
}returnres;
}
減法:a-b
由-b=+(-b),~(b-1)=-b可得a-b=a+(-b)=a+(~(b-1))。把減法轉(zhuǎn)化為加法即可。
public int minus(int a,intb) {int B=~(b-1);returnadd(a, B);
}
乘法:a*b
先來看一下二進制乘法是怎么做的:
1011
* 1010
--------
10110 (1011<<1,相當于乘以0010)1011000 (1011<<3,相當于乘以1000)--------
1101110
可以看到,二進制乘法的原理是:從乘數(shù)的低位到高位,遇到1并且這個1在乘數(shù)的右起第i(i從0開始數(shù))位,那么就把被乘數(shù)左移i位得到 temp_i 。直到乘數(shù)中的1遍歷完后,把根據(jù)各位1而得到的被乘數(shù)的左移值們 temp_i 相加起來即得乘法結(jié)果。那么根據(jù)這個原理,可以得到實現(xiàn)代碼:這里要點為:用i記錄當前遍歷的乘數(shù)位,當前位為1則被乘數(shù)左移i位并加到和中,同時i++處理下一位;為0則乘數(shù)右移,i++,處理下一位......直到乘數(shù)==0說明乘數(shù)中的1遍歷完了。此時把和返回即可。
public int multi(int a,intb){int i=0;int res=0;while(b!=0){//乘數(shù)為0則結(jié)束//處理乘數(shù)當前位
if((b&1)==1){
res+=(a<
b=b>>1;++i;//i記錄當前位是第幾位
}else{
b=b>>1;++i;
}
}returnres;
}
除法:a/b
除法的意義就在于:求a可以由多少個b組成。那么由此我們可得除法的實現(xiàn):求a能減去多少個b,做減法的次數(shù)就是除法的商。
public int sub(int a,intb) {int res=-1;if(a
}else{
res=sub(minus(a, b), b)+1;
}returnres;
}
總結(jié)
以上是生活随笔為你收集整理的java实现三位数加减乘除_用Java位运算实现加减乘除四则运算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java ftp 下载慢_Java实现f
- 下一篇: kinana 清空索引数据_(Elast