演算法 位運算問題之三(實現加減乘除)

2022-08-22 07:57:11 字數 1446 閱讀 6410

給定32位整數a和b,可正、可負、可0,不能使用算術運算子,可分別實現a和b的加減乘除運算。

無進製相加:

a:001010101

b:000101111

a^b001111010

只考慮進製:

a001010101

b000101111

(a&b)<<1

000001010

把完全不考慮進製的相加值與只與考慮進製的產生值再相加,就是最後的結果。重複這樣的過程,直到進製產生的值完全消失,說明所有的過程都加完了。

public

static

int add(int a, int

b)

return

sum;

}

實現a-b其實就是a+(-b),根據二進位制在機器中表達的規則,得到乙個數的相反數,就是這個數的二進位制表達取反加1(補碼)的結果。

public

static

int negnum(int

n)

public

static

int minus(int a, int

b)

res=a*20*b0+a*21*b1+…+a*2i*bi+…+a*231*b31,bi為0或1代表整數b的二進位制數表示式中第i位的值。

public

static

int multi(int a, int

b) a

<<= 1;

b >>>= 1;

}return

res;

}

b=res*a   ==>   a=b*20*res0+b*21*res1+…+b*2i*resi+…+b*231*res31

//

判斷是否為負

public

static

boolean isneg(int

n)

//相除的核心演算法

public

static

int div(int a, int

b) }

return isneg(a) ^ isneg(b) ?negnum(res) : res;

}//加上特殊情況

public

static

int divide(int a, int

b)

//分子分母均為最小值

if (a == integer.min_value && b ==integer.min_value) else

if (b ==integer.min_value) else

if (a ==integer.min_value)

else

}

位運算實現加減乘除

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。...