我正在阅读算法和数据结构教科书,并提出了这个问题:
1-28.编写一个函数来执行整数除法而不使用/或*运算符.找到一种快速的方法来做到这一点.
我们怎样才能想出一个快速的方法呢?
我喜欢这个解决方案:https:|//stackoverflow.com/a/34506599/1008519 ,但我发现它有点难以推理(特别是-part).这个解决方案让我的头脑更有意义:
var divide = function (dividend, divisor) {
// Handle 0 divisor
if (divisor === 0) {
return NaN;
}
// Handle negative numbers
var isNegative = false;
if (dividend < 0) {
// Change sign
dividend = ~dividend+1;
isNegative = !isNegative;
}
if (divisor < 0) {
// Change sign
divisor = ~divisor+1;
isNegative = !isNegative;
}
/**
* Main algorithm
*/
var result = 1;
var denominator = divisor;
// Double denominator value with bitwise shift until bigger than dividend
while (dividend > denominator) {
denominator <<= 1;
result <<= 1;
}
// Subtract divisor value until denominator is smaller than dividend
while (denominator > dividend) {
denominator -= divisor;
result -= 1;
}
// If one of dividend or divisor was negative, change sign of result
if (isNegative) {
result = ~result+1;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
以下是一些测试运行:
console.log(divide(-16, 3)); // -5
console.log(divide(16, 3)); // 5
console.log(divide(16, 33)); // 0
console.log(divide(16, 0)); // NaN
console.log(divide(384, 15)); // 25
Run Code Online (Sandbox Code Playgroud)
以下是解决方案的要点:https://gist.github.com/mlunoe/e34f14cff4d5c57dd90a5626266c4130