// 不考虑溢出 publicintgetMax1(int a, int b){ int c = a - b; //可能会溢出 int scA = sign(c); // a-b为非负 scA为1,否则是0 int scB = sign(scA); // scA为0 scb必为1;scA为0,scb为0 return a * scA + b * scB; }
// 考虑溢出 publicintgetMax2(int a, int b){ int c = a - b; //可能会溢出 int sa = sign(a); int sb = sign(b); int sc = sign(c); int diffSab = sa ^ sb; //a和b符号不一样为1,一样为0 int sameSab = flip(diffSab); //a和b符号一样为1,不 一样为0 /* 返回a a和b符号相同 a-b >=0 a和b符号不相同 a > 0 */ int returnA = diffSab * sa + sameSab * sc; int returnB = flip(returnA); return a * returnA + b * returnB; } }
// a+b保证不溢出 // leetcode 371 两数相加无+- publicintadd(int a, int b){ int sum = a; while (b != 0) { sum = a ^ b; // 无进位加 b = (a & b) << 1; // 进位信息 a = sum; } return sum; }
// 相减 a-b = a + (-b) publicintminus(int a, int b){ return add(a, negNum(b)); }
// 相乘 publicintmulti(int a, int b){ int res = 0; while (b != 0) { if ((b & 1) != 0) { // 从最后一位开始计算 res = add(res, a); } a <<= 1; b >>>= 1; } return res; }
// 相除 publicintdiv(int a, int b){ int x = isNeg(a) ? negNum(a) : a; int y = isNeg(b) ? negNum(b) : b; int res = 0; for (int i = 31; i > -1; i = minus(i, 1)) { // 已经到最大相除的位置 y相左移可能会溢出 if ((x >> i) >= y) { res |= (1 << i); x = minus(x, y << i); } } return isNeg(a) ^ isNeg(b) ? negNum(res) : res; }
publicintdivide(int a, int b){
if (a == Integer.MIN_VALUE && b == Integer.MIN_VALUE) { return1; } elseif (b == Integer.MIN_VALUE) { // a和b不都是最小值 return0; } elseif (a == Integer.MIN_VALUE && b < 0){ return Integer.MAX_VALUE; } elseif (a == Integer.MIN_VALUE) { int res = div(add(a, 1), b); return add(res, div(minus(a, multi(res, b)), b)); } else { return div(a, b); }