publicstaticfinalintnear2power(int n) { if (n <= 0) { return1; } n--; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return n + 1; }
publicstaticintdivide(int a, int b) { if (a == MIN && b == MIN) { // a和b都是整数最小 return1; } if (a != MIN && b != MIN) { // a和b都不是整数最小,那么正常去除 return div(a, b); } if (b == MIN) { // a不是整数最小,b是整数最小 return0; } // a是整数最小,b是-1,返回整数最大,因为题目里明确这么说了 if (b == neg(1)) { return Integer.MAX_VALUE; } // a是整数最小,b不是整数最小,b也不是-1 a = add(a, b > 0 ? b : neg(b)); intans= div(a, b); intoffset= b > 0 ? neg(1) : 1; return add(ans, offset); }
// 必须保证a和b都不是整数最小值,返回a除以b的结果 publicstaticintdiv(int a, int b) { intx= a < 0 ? neg(a) : a; inty= b < 0 ? neg(b) : b; intans=0; for (inti=30; i >= 0; i = minus(i, 1)) { if ((x >> i) >= y) { ans |= (1 << i); x = minus(x, y << i); } } return a < 0 ^ b < 0 ? neg(ans) : ans; }
publicstaticintadd(int a, int b) { intans= a; while (b != 0) { // ans : a和b无进位相加的结果 ans = a ^ b; // b : a和b相加时的进位信息 b = (a & b) << 1; a = ans; } return ans; }
publicstaticintminus(int a, int b) { return add(a, neg(b)); }
publicstaticintneg(int n) { return add(~n, 1); }
// 这种乘法后面有大用处,尤其是求(a的b次方 % m)的结果,也叫龟速乘 publicstaticintmultiply(int a, int b) { intans=0; while (b != 0) { if ((b & 1) != 0) { // 考察b当前最右的状态! ans = add(ans, a); } a <<= 1; b >>>= 1; } return ans; }