1.加法
基本思路:
- 使用位运算a ^ b来实现没有进位的本位和
- 用a & b来获得需要进位的位置,则(a & b << 1)则表示进位加1后的数
- 再用或运算求本位和,直至(a & b) == 0即没有进位为止。
代码
int Add(int a, int b){return b ? Add(a ^ b, (a & b) << 1) : a;}
2.减法
基本思路:
- 将a - b 转换成a + (-b)
- 由于 ~ b = -(b + 1),故 -b = ~b + 1
代码
int Minus(int a, int b){return Add(a, Add(~b, 1));}
3.乘法
基本思路:
- 暴力算法:模拟加法,但是加法次数太多
- 模拟手算乘法,当乘数最后一位是1,则结果加上被乘数
- 一次判断后,要将乘数右移一位,被乘数左移一位
- 当乘数为0时,终止运算
代码
int Multiply(int a, int b){int a1 = a > 0 ? a : Add(~a, 1);int b1 = b > 0 ? b : Add(~b, 1);int sum = 0;while(b1){if(b1 & 0x1){sum = Add(sum, a1);}a1 = a1 << 1;b1 = b1 >> 1;}if((a ^ b) < 0)return Add(~sum, 1);else return sum;}
4.除法
基本思路:
- 暴力做法:模拟减法,但是减法次数太多
- 考虑到int的大小为32个bit,则从i=32开始比较被除数与除数2^i的大小
- 若被除数大,则在商处直接加上2^i从而减小减法的次数
代码
int Divide(int a, int b){int quotient = 0;if(!b){cout << "Error" << endl;return 1;}for(int i = 31; i --; i > 0){if((a >> i) >= b){quotient = Add(quotient, 1 << i);a = Minus(a, b << i);}}if((a ^ b) < 0)quotient = Add(~quotient, 1);return quotient;}
