classSolution { public: intadd(int num1, int num2){ while (num2) { /* 经过XOR操作后,1/0,0/1,0/0都已经符合预期了,只是1/1? 本来应该成为10,却变成了0? 我们怎样才能找回丢失的进位呢? 只有&操作才能将两个1变为1,也许是我们好的选择? 实际上,这就是计算机执行加法的底层原理。 */ int sum = num1 ^ num2; int carry = (num1 & num2) << 1; num1 = sum; num2 = carry; //用计算出来的结果重新赋值,有点辗转相除法的感觉。 } return num1; }
intsub(int num1, int num2){ //a - b = a + (-b) return add(num1, add(~num2, 1))) }
int mul(int a, int b) { //最笨的方法是for循环--b次; 有没有更好的办法呢? //都转为正数先 int a1 = a >= 0 ? a : add(~a, 1); int b1 = b >= 0 ? b : add(~b, 1); int sum = 0; //整个过程跟手动乘法类似 while (b1) { if (b1 & 0x01) { sum = add(sum, a1); } a1 <<= 1; b1 >>= 1; }
//异号,相反数 if (a ^ b < 0) { sum = add(-sum, 1); }
return sum; }
intdiv(int a, int b, int& reminder){ int r = 0; //都转为正数先 int a1 = a >= 0 ? a : add(~a, 1); int b1 = b >= 0 ? b : add(~b, 1); for (int i = 31; i >= 0; i--) { if ((a1 >> i) >= b1) { // a >= (b << i) r = add(r, 1 << i); a1 = sub(a1, b1 << i); } }