**:
^: 按位異或;&:按位與; | :按位或
計算機系統中,數值一律用補碼來表示:因為補碼可以使符號位和數值位統一處理,同時可以使減法按照加法來處理。
對補碼做簡單介紹:數值編碼分為原碼,反碼,補碼,符號位均為0正1負。
原碼 -> 補碼: 數值位取反加1
補碼 -> 原碼: 對該補碼的數值位繼續 取反加1
補碼 的絕對值(稱為真值):正數的真值就是本身,負數的真值是各位(包括符號位)取反加1(即變成原碼並把符號位取反).
b -> -b : 各位(包括符號位)取反加1
加法運算:將乙個整數用二進位制表示,其加法運算就是:相異(^)時,本位為1,進製為0;同為1時本位為0,進製為1;同為0時,本位進製均為0.
所以,不計進製的和為sum = a^b,進製就是arr = a&b,(與sum相加時先左移一位,因為這是進製)。完成加法直到進製為0.
減法運算:a-b = a+(-b) 根據補碼的特性,各位取反加1即可(注意得到的是相反數,不是該數的補碼,因為符號位改變了)
(上面用二進位制實現的加減法可以直接應用於負數)
乘法運算:原理上還是通過加法計算。將b個a相加,注意下面實際的**。
除法運算:除法運算是乘法的逆。看a最多能減去多少個b,
1 #include2 #include3using
namespace
std;45
//遞迴版本的加法實現
6int add(int a, intb)7
1617
//該為迭代版本
18int add_iter(int a, int
b)19
27return
ans;28}
2930
//求a的相反數:將各位取反加一
31int negative(int a) //
get -a
3235
36int minus(int a, int
b)37
4041
//正數乘法
42int multi(int a, int
b)43
52return
ans;53}
5455
//正數除法
56int divide(int a, int
b)57
64return
coun;65}
6667
//判斷是否是負數,0,正數
68int isneg(int
a)69
72int iszero(int
a)73
76int ispos(int
a)77
8081
//處理負數的乘法和除法
82int my_multi(int a, int
b)83
else
if(isneg(b))
93return
negative(multi(a, negative(b)));
94else
95return
multi(a, b);96}
9798
int my_divide(int a, int
b)99
105if
(iszero(a))
106return0;
107if
(isneg(a))
108else
if(isneg(b))
114return
negative(divide(a, negative(b)));
115else
116return
divide(a, b);
117118
}119
120int main(int argc, char **argv)
121
用位運算實現四則運算之加減乘除
加法運算 cpp view plain copy intaddwithoutarithmetic intnum1,intnum2 簡化一下 cpp view plain copy intadd inta,intb 上面的思路就是先不計進製相加,然後再與進製相加,隨著遞迴,進製會變為0,遞迴結束。非遞...
用位運算實現四則運算之加減乘除
原文 用位運算實現四則運算之加減乘除 遞迴版本 int add int num1,int num2 遞迴簡化版本 int add2 int num1,int num2 非遞迴版本 int add3 int num1,int num2 return num1 兩數相加,和的部分可用 異或 完成,進製部...
用位運算實現四則運算之加減乘除
加法運算 int addwithoutarithmetic int num1,int num2 簡化一下 int add int a,int b 上面的思路就是先不計進製相加,然後再與進製相加,隨著遞迴,進製會變為0,遞迴結束。非遞迴的版本如下 int add int a,int b return ...