背景:
好久沒接觸位運算子了,拿個小題來練練手吧~
不用加減號實現加減法運算,這個題目一聽就知道要用位運算子了,先複習下位運算的基本操作吧:
與運算子(&
): 如果相對應位都是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...