位运算实现加减乘除
29. 两数相除
#include <iostream> using namespace std; class Solution { public: int add(int a, int b) { int res = a; while (b != 0) { // 无进位相加的结果 res = a ^ b; // 相加时每一位的进位信息 b = (a & b) << 1; // 无进位相加的结果 a = res; // 如果进位信息 b 不全是 0 的话,仍需将进位信息 b 与无进位相加的结果 a 继续相加 } return res; } // 补码:原码按位取反再加一 int neg(int n) { return add(~n, 1); } int minus(int a, int b) { return add(a, neg(b)); } int multiply(int a, int b) { int res = 0; while (b != 0) { if ((b & 1) != 0) res = add(res, a); // 算数左移 a <<= 1; // 逻辑右移 b = (unsigned int) b >> 1; } return res; } // 必须保证 a 和 b 都不是整数最小值,返回 a 除以 b 的结果 int div(int a, int b) { // 先转成非负数 int x = a < 0 ? neg(a) : a; int y = b < 0 ? neg(b) : b; int res = 0; for (int i = 30; i >= 0; i = minus(i, 1)) { // 如果 x 中包含 y * 2^i if ((x >> i) >= y) { res |= (1 << i); // x 减去 y * 2^i x = minus(x, y << i); } } // 判断结果符号 return a < 0 ^ b < 0 ? neg(res) : res; } const int MIN = INT_MIN; const int MAX = INT_MAX; int divide(int a, int b) { // a 和 b 都是整数最小 if (a == MIN && b == MIN) return 1; // a 和 b 都不是整数最小,正常除 if (a != MIN && b != MIN) return div(a, b); // a 不是整数最小,b 是整数最小 if (b == MIN) return 0; // a 是整数最小,b 是 -1,返回整数最大(题目要求) if (b == neg(1)) return MAX; // a 是整数最小,b 不是整数最小,b 也不是 -1 // 先把 a 变大一点,最终结果再减去 1 或者 加上 1 a = add(a, b > 0 ? b : neg(b)); int res = div(a, b); int offset = b > 0 ? neg(1) : 1; return add(res, offset); } };
本文作者:n1ce2cv
本文链接:https://www.cnblogs.com/sprinining/p/18424320
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步