Last active
August 17, 2018 07:49
-
-
Save mlunoe/e34f14cff4d5c57dd90a5626266c4130 to your computer and use it in GitHub Desktop.
Integer division without using / or *
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This solution does not handle decimal results, it only handles the largest integer division, but could easily return the remainder (
dividend - denominator
).