mirror of
https://github.moeyy.xyz/https://github.com/trekhleb/javascript-algorithms.git
synced 2024-12-25 22:46:20 +08:00
Refactor bitwise multiplication.
This commit is contained in:
parent
53c7143e07
commit
50c025949b
15
src/algorithms/math/bits/__test__/multiplyUnsigned.test.js
Normal file
15
src/algorithms/math/bits/__test__/multiplyUnsigned.test.js
Normal file
@ -0,0 +1,15 @@
|
||||
import multiplyUnsigned from '../multiplyUnsigned';
|
||||
|
||||
describe('multiplyUnsigned', () => {
|
||||
it('should multiply two unsigned numbers', () => {
|
||||
expect(multiplyUnsigned(0, 2)).toBe(0);
|
||||
expect(multiplyUnsigned(2, 0)).toBe(0);
|
||||
expect(multiplyUnsigned(1, 1)).toBe(1);
|
||||
expect(multiplyUnsigned(1, 2)).toBe(2);
|
||||
expect(multiplyUnsigned(2, 7)).toBe(14);
|
||||
expect(multiplyUnsigned(7, 2)).toBe(14);
|
||||
expect(multiplyUnsigned(30, 2)).toBe(60);
|
||||
expect(multiplyUnsigned(17, 34)).toBe(578);
|
||||
expect(multiplyUnsigned(170, 2340)).toBe(397800);
|
||||
});
|
||||
});
|
@ -1,14 +0,0 @@
|
||||
/**
|
||||
* @param {number, number}
|
||||
* @return {number}
|
||||
*/
|
||||
export default function multiply(number1, number2) {
|
||||
var c = 0, result = 0;
|
||||
while(number2){
|
||||
if(number2&1)
|
||||
result += (number1 << c);
|
||||
c += 1;
|
||||
number2 >>= 1;
|
||||
}
|
||||
return result;
|
||||
}
|
43
src/algorithms/math/bits/multiplyUnsigned.js
Normal file
43
src/algorithms/math/bits/multiplyUnsigned.js
Normal file
@ -0,0 +1,43 @@
|
||||
/**
|
||||
* Multiply to unsigned numbers using bitwise operator.
|
||||
*
|
||||
* The main idea of bitwise multiplication is that every number may be split
|
||||
* to the sum of posers of two:
|
||||
*
|
||||
* I.e. 19 = 2^4 + 2^1 + 2^0
|
||||
*
|
||||
* Then multiplying number x by 19 is equivalent of:
|
||||
*
|
||||
* x * 19 = x * 2^4 + x * 2^1 + x * 2^0
|
||||
*
|
||||
* Now we need to remember that (x * 2^4) is equivalent of shifting x left by 4 bits (x << 4).
|
||||
*
|
||||
* @param {number} number1
|
||||
* @param {number} number2
|
||||
* @return {number}
|
||||
*/
|
||||
export default function multiplyUnsigned(number1, number2) {
|
||||
let result = 0;
|
||||
|
||||
// Let's treat number2 as a multiplier for the number1.
|
||||
let multiplier = number2;
|
||||
|
||||
// Multiplier current bit index.
|
||||
let bitIndex = 0;
|
||||
|
||||
// Go through all bits of number2.
|
||||
while (multiplier !== 0) {
|
||||
// Check if current multiplier bit is set.
|
||||
if (multiplier & 1) {
|
||||
// In case if multiplier's bit at position bitIndex is set
|
||||
// it would mean that we need to multiply number1 by the power
|
||||
// of bit with index bitIndex and then add it to the result.
|
||||
result += (number1 << bitIndex);
|
||||
}
|
||||
|
||||
bitIndex += 1;
|
||||
multiplier >>= 1;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
Loading…
Reference in New Issue
Block a user