位操作实现加减乘除和幂运算
位操作在一定程度上加快了计算的速度,上本科的时候实现过位运算的各种运算,时间长了已经忘光了,拿出来重新实现实现。
位操作回顾
与(&):同真为真,其余为假 0&0=0、0&1=0、1&0=0、1&1=1
或(|):有真为真,无真为假0|0=0、0|1=1、1|0=1、1|1=1
非(~):真变假,假变真~0=1、~1=0
异或(^):不同为真,相同为假0^0=0、0^1=1、1^0=1、1^1=0
加法
各种运算中加法应该算是基础,所以我们先实现加法。
模拟小学加法运算,每位相加,一位存不下则向上进位。0 | 0 = 0、 0 | 1 = 1、1 | 0 = 1、 1 | 1 = 10,只观察最后一位我们发现与异或运算时匹配的,然后需要考虑的是1|1=10进位的问题。
1|1=10进位也只可能实在1|1的情况,因此我们只需要考虑1、1的情况,恰好是与的情况,然后向左移一位变成了进位了。
不考虑进位的加法=异或(^)
进位=与(&)
到这一步大家应该也可以想到了,先把两个数的异或运算拿到,然后获得两个数的进位,接下来的就是把这两个数相加了,那是不是又有问题了!我们是来实现加法运算的,结果又需要调用加法运算!这不是相互矛盾么!
对啊!我们不是实现加法运算么,那就把这两个数再调用一次加法运算呗!那啥时候是个头呢?
0加任何数不都得原值么,进位始终是要进完的,所以进位到不能进位为止,咱们就可以返回这个值了。
int add(int a, int b){
int yihuo, yu;
yihuo = a ^ b; //不考虑进位的加法操作
yu = (a & b) << 1; //进位
if(yu == 0){
return yihuo;