不用加減號實現加減法(java實現)

2021-08-29 18:51:40 字數 1811 閱讀 8042

背景:

好久沒接觸位運算子了,拿個小題來練練手吧~

不用加減號實現加減法運算,這個題目一聽就知道要用位運算子了,先複習下位運算的基本操作吧:

與運算子(&

): 如果相對應位都是1,則結果為1,否則為0

或運算子(|

): 如果相對應位都是0,則結果為0,否則為1

非運算子(~

): 按位取反運算子翻轉運算元的每一位,即0變成1,1變成0。

異或運算子(^

): 如果相對應位值相同,則結果為0,否則為1

再來想想十進位制加法如何實現:

比如18+15,先十位上1+1=2,個位上8+5如果不考慮進製則為3,其中進製為十位上的1,故和為23+1*10=33

可以看到,加法運算的步驟:

1.先不考慮進製,各對應位上相加

2.加上第一步各對應位相加產生的進製值

上面的步驟還是用到了加法乘法,如果換成二進位制又有哪些不同呢:

測試20+15=35這個算式:

20:0001 0100

15:0000 1111

35:0010 0011

我們可以發現二進位制的加法,如果不考慮進製,各位上是這樣運算的:

0+0=0,1+0=1,1+1=0;這不就是位值相同為0,不同為1嗎?所以可以等價於異或運算

進製則發生在位值都為1的時候,位值同為0或乙個為0乙個為1都不會觸發進製,這和與運算不謀而合!所以可以等價於與運算後左移一位

結合上面的步驟,我們可以清楚的得到二進位制位運算實現加法的操作(a+b):

1.a = a ^ b

2.b =

(a & b)

<<

13.重複1、2步驟直到進製值為0

至於減法(a-b):

只要把a和b的補碼(~b + 1)相加就行啦!

/**

* @author: yuanj

* @createdate: 2018/10/23 22:21

* @version: 1.0

*/public

class

testsumsub

/** * 加法

* @param num1

* @param num2

* @return

*/public

static

intaddwithbitoperator

(int num1,

int num2)

while

(carrybit !=0)

;return sum;

}/**

* 減法

* @param num1

* @param num2

* @return

*/public

static

intsubwithbitoperator

(int num1,

int num2)

}

不用加減法做加法

這裡只能想到位運算了,思路如下 假設a 5,b 17 對應的二進位制數即為 a 0000 0101 b 0001 0001 要想求解兩個數的和,就得分如下三步來計算 1.計算不帶進製的兩個數的和 2.計算兩個數在計算中發生的進製 3.將不帶進製的和與發生的進製求和,得出最終結果 好了,這裡我們可以來...

不用加號和減號來實現加減法 利用位運算

public class 加減法 public static intplus int a int b if b 0 int x a b 1 這個相當於是進製 與一下是1說明都是1,把它們左移就是全部進製的數,再和下面沒進製的一加就是結果 int y a b 這個相當於是沒進製的,或一下是1說明只有一...

時間加減法

include stdafx.h include windows.h typedef struct tagmydate mydate 用於表示兩個時間之間的差值,負值表示慢,正值表示快 typedef struct tagtimedistance timedistance int month day...