Skip to content

Instantly share code, notes, and snippets.

@mlunoe
Last active August 17, 2018 07:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mlunoe/e34f14cff4d5c57dd90a5626266c4130 to your computer and use it in GitHub Desktop.
Save mlunoe/e34f14cff4d5c57dd90a5626266c4130 to your computer and use it in GitHub Desktop.
Integer division without using / or *
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
@mlunoe
Copy link
Author

mlunoe commented May 8, 2016

This solution does not handle decimal results, it only handles the largest integer division, but could easily return the remainder (dividend - denominator).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment