寫在前面:加法在測試時遇到了乙個問題,用python在算-4+8時,會無限迴圈
我列印了每一次的sum和carry,原來是carry會越來越大
到後面會非常大
但是我試了下c++發現是可以計算的,它溢位後會變成4+0
1、加法
def
add(a, b)
:# 遞迴
if b==0:
return a
sum= a ^ b # 異或得到兩數之和
carry =
(a & b)
<<
1# 與得到進製,左移後與sum相加
return add(
sum, carry)
defadd
(a, b)
:# 非遞迴
sum=
0 carry =
0while b:
sum= a ^ b
carry =
(a & b)
<<
1 a =
sum b = carry
return a
2、減法
def
sub(a, b)
:return add(a, add(
~b,1
))
3、乘法
def
mul(a, b)
: flag =
true
if(a^b)
>=
0else
false
# 同號時flag為true
if a<0:
a = add(
~a,1
)if b<0:
b = add(
~b,1
) res =
0while b:
if b&1:
res = add(res, a)
a <<=1
b >>=1
return res if flag else add(
~res,
1)
4、除法
def
div(a, b)
: flag =
true
if(a^b)
>=
0else
false
# 同號時flag為true
if a<0:
a = add(
~a,1
)if b<0:
b = add(
~b,1
) res =
0for i in
range(31
,-1,
-1):
if a>=
(b<
: res = add(res,
1<
a = sub(a, b<
return res if flag else add(
~res,
1)
位運算實現加減乘除
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...
位運算實現加減乘除
關於邏輯右移和算術右移 vs中,對於unsigned型別,是邏輯右移,對於signed,算術右移 加法器的實現 對於不考慮進製的加法 0 0 0 1 0 1 0 1 1 1 1 0 即是異或運算 考慮進製 0 0 1 0 0 0 1 0 1 1 1 即是與運算 以下程式,a即不考慮進製部分,b為進製...
位運算實現加減乘除
位運算的思想可以應用到很多地方,這裡簡單的總結一下用位運算來實現整數的四則運算。1.整數加法 cpp view plain copy intadd inta,intb return a 我的思路主要是利用a 1的位運算就是最左端 從第0位開始向左 連續的1變為0,原先a中為0的位置最低那一位變為1。...