感謝部落格: 提供的思路。
要用位運算來實現四則運算,不僅僅要知道&,|,~,^,<<,>>怎麼做,還需要先掌握位運算的幾個運算規律:
1:~n=-(n+1),比如:~3=-4
2:獲取整數n的二進位制串中最後乙個1:-n&n=~(n-1)&n
3:去掉整數n的二進位制串中最後乙個1:n&(n-1)。
然後,我們就可以使用常規位運算並結合上面的運算規律來實現四則運算了。
加法:a+b
由a^b可得按位相加後沒有進製的和;
由a&b可得可以產生進製的地方;
由(a&b)<<1得到進製後的值。
那麼 按位相加後原位和+進製和 就是加法的和了,而 a^b + (a&b)<<1 相當於把 + 兩邊再代入上述三步進行加法計算。直到進製和為0說明沒有進製了則此時原位和即所求和。
publicint add(int a,int
b) else
return
res;
}
減法:a-b
由-b=+(-b),~(b-1)=-b可得a-b=a+(-b)=a+(~(b-1))。把減法轉化為加法即可。
publicint minus(int a,int
b)
乘法:a*b
先來看一下二進位制乘法是怎麼做的:
1011* 1010
--------
10110 (1011<<1,相當於乘以0010)
1011000 (1011<<3,相當於乘以1000)
--------
1101110
可以看到,二進位制乘法的原理是:從乘數的低位到高位,遇到1並且這個1在乘數的右起第i(i從0開始數)位,那麼就把被乘數左移i位得到 temp_i 。直到乘數中的1遍歷完後,把根據各位1而得到的被乘數的左移值們 temp_i 相加起來即得乘法結果。那麼根據這個原理,可以得到實現**:這裡要點為:用i記錄當前遍歷的乘數字,當前位為1則被乘數左移i位並加到和中,同時i++處理下一位;為0則乘數右移,i++,處理下一位......直到乘數==0說明乘數中的1遍歷完了。此時把和返回即可。
publicint multi(int a,int
b)else
}return
res;
}
除法:a/b
除法的意義就在於:求a可以由多少個b組成。那麼由此我們可得除法的實現:求a能減去多少個b,做減法的次數就是除法的商。
publicint sub(int a,int
b) else
return
res;
}
C 用位運算實現加減乘除
include using namespace std intmain cout 兩個數x y求異或,得到的x,y不進製的和x0 101y 0110 x y001 1x與y求與,再左移一位,得到的是進製的數。x0 101y 0110 x y010 0 x y 110 00將不進製的和與進製的數再求和...
用Java位運算實現加減乘除四則運算
要用位運算來實現四則運算,不僅僅要知道 怎麼做,還需要先掌握位運算的幾個運算規律 1 n n 1 比如 3 4 2 獲取整數n的二進位制串中最後乙個1 n n n 1 n 3 去掉整數n的二進位制串中最後乙個1 n n 1 然後,我們就可以使用常規位運算並結合上面的運算規律來實現四則運算了 由a b...
位運算實現加減乘除
include include 加法運算 int add int a,int b 補碼中正數轉負數的原理 int negative int a 減法運算 int sub int a,int b 判斷正負 bool isnegative int a 僅計算正數乘法 int multi help int...