成都建设路小学网站个体工商户 网站备案
web/
2025/9/30 13:03:15/
文章来源:
成都建设路小学网站,个体工商户 网站备案,google官方下载,盐城网站建设方案前言 Leetcode中有一道这样的题:给定两个整数#xff0c;被除数 dividend 和除数 divisor。将两数相除#xff0c;要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。 如果正常的四则运算符号不允许使用#xff0c;呢这道题的考点我觉得应… 前言 Leetcode中有一道这样的题:给定两个整数被除数 dividend 和除数 divisor。将两数相除要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。 如果正常的四则运算符号不允许使用呢这道题的考点我觉得应该是位运算来实现遇到了就好好复习一下下面将介绍二进制实现四则运算: 二进制码 位运算是基于二进制运算的实际上目前的计算机都只识别二进制码我们所写的一切指令事实上都是一串010101数字、传输数据也是按比特流的形式传输的。所以先介绍二进制码: 原码 最高位表示符号位0代表正数1代表负数。剩下的位数是这个数的绝对值的二进制。 比如 一个int变量大小为4字节在32位的编译器中的二进制表示就是00000000 00000000 00000000 0000000 10 的原码 00000000 00000000 00000000 00001010
−10的原码 10000000 00000000 00000000 00001010 反码 正数的反码和其原码是一样的 负数的反码就是在其原码的基础上 符号位不变 其他位取反。 10的反码 00000000 00000000 00000000 00001010
−10的反码11111111 11111111 11111111 11110101 补码 正数的补码就是其原码 负数的补码就是在其反码的基础上1 10的补码00000000 00000000 0000000 00001010
−10的补码11111111 11111111 11111111 11110110 在计算机系统中数值一律用补码来表示:因为补码可以是符号位和数值位统一处理同时可以试减法按照加法来处理。 位运算加法 0111 ^ 0101 0010; //结果的每一位等于对应位相加模二刚好是不带进位的加法结果。
0111 0101 0101; //结果的1表示对应位相加为20表示对应位相加小于二刚好是进位标识。 所以有: int add(int a, int b)
{return (b 0) ? a : add(a^b, (ab) 1);
} 位运算减法 减法其实就是加上这个数的相反数这个数原来是用正数的补码表示的现在变成负数的补码形式了:所以只需要将这个数每一位取反再末尾家一就行了: int subtraction(int a, int b)
{b add(~b, 1);return add(a, b);
} 位运算乘法 对于a * b每次只需要将a左移一位乘上b的对应位然后同上一次的结果做加法即可。 当b的对应位为1时对a左移一位然后同上一次的结果做加法;如果b的对应位为0只对a左移一位。 int getsign(int n)
{return n 31;
}int positive(int n)
{return (getsign(n) 1) ? add(~n,1): n;
}int multiply(int a, int b)
{bool flag (getsign(a) ^ getsign(b)) ? 1 : 0;a positive(a);b positive(b);int res 0;while (b) {if (b 1)res add(res, a); //只有当前b末尾为1时才运算a a 1; b b 1;}if (flag)add(~res, 1);return res;
} 位运算除法 同乘法一样除法也可以进行二进制笔算以a / b为例只有当a b时才可以上商又因为是二进制所以商每次只会多1在每次上1之后a都要减去一次b。 int divide(int a, int b)
{if (b 0)throw runtime_error(DIVIDED CANNOT BE 0);bool flag (getsign(a) ^ getsign(b)) ? 1 : 0;a positive(a);b positive(b);int res 0;while (a b){res add(res, 1);a subtraction(a, b);}return flag ? add(~res, 1) : res;
} 总代码如下: int add(int a, int b)
{return (b 0) ? a : add(a^b, (ab) 1);
}int subtraction(int a, int b)
{b add(~b, 1);return add(a, b);
}int getsign(int n)
{return n 31;
}int positive(int n)
{return (getsign(n) 1) ? add(~n,1): n;
}int multiply(int a, int b)
{bool flag (getsign(a) ^ getsign(b)) ? 1 : 0;a positive(a);b positive(b);int res 0;while (b) {if (b 1)res add(res, a); //只有当前b末尾为1时才运算a a 1; b b 1;}if (flag)add(~res, 1);return res;
}int divide(int a, int b)
{if (b 0)throw runtime_error(DIVIDED CANNOT BE 0);bool flag (getsign(a) ^ getsign(b)) ? 1 : 0;a positive(a);b positive(b);int res 0;while (a b){res add(res, 1);a subtraction(a, b);}return flag ? add(~res, 1) : res;
} 转载于:https://www.cnblogs.com/yunlambert/p/9845897.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84467.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!