): Array<number> {
let result = [];
let carry = 0;
- const aLength = aDigits.length;
- const bLength = bDigits.length;
- for (let i = 0; i < aLength || i < bLength || carry; i++) {
- const aDigit = i < aLength ? aDigits[aLength - i - 1] : 0;
- const bDigit = i < bLength ? bDigits[bLength - i - 1] : 0;
+ for (let i = 0; i < aDigits.length || i < bDigits.length || carry; i++) {
+ const aDigit = i < aDigits.length ? aDigits[i] : 0;
+ const bDigit = i < bDigits.length ? bDigits[i] : 0;
const sum = aDigit + bDigit + carry;
- result.unshift(sum % base);
+ result.push(sum % base);
// ~~ here is the equivalent of Math.floor; used to avoid V8 de-opt,
// "Reference to a variable which requires dynamic lookup".
/**
* Breaks the string repsentation of `number` in `base` into an array of decimal
- * digits (from most significant to least significant) for easier manipulation.
+ * digits (from least significant to most significant) for easier manipulation.
*
- * For example, the hexadecimal representation `"40fa"` becomes
- * `[4, 0, 15, 10]`.
+ * For example, the hexadecimal representation `"40fa"` becomes `[10, 15, 0,
+ * 4]`.
*/
export default function getDigits(number: string, base: number): Array<number> {
- return stripPrefix(number, base).trim().split('').map(digit => {
+ return stripPrefix(number, base).trim().split('').reverse().map(digit => {
const result = parse(digit, base);
if (isNaN(result)) {
throw new Error('Invalid digit `' + digit + '` for base `' + base + '`');
});
it('multiplies by 2', () => {
- expect(multiplyDigits([1], 2, 2)).toEqual([1, 0]);
- expect(multiplyDigits([5], 2, 8)).toEqual([1, 2]);
+ expect(multiplyDigits([1], 2, 2)).toEqual([0, 1]);
+ expect(multiplyDigits([5], 2, 8)).toEqual([2, 1]);
expect(multiplyDigits([4], 2, 10)).toEqual([8]);
- expect(multiplyDigits([12], 2, 16)).toEqual([1, 8]);
+ expect(multiplyDigits([12], 2, 16)).toEqual([8, 1]);
});
it('multiplies by 100', () => {
- expect(multiplyDigits([1], 100, 2)).toEqual([1, 1, 0, 0, 1, 0, 0]);
- expect(multiplyDigits([5], 100, 8)).toEqual([7, 6, 4]);
- expect(multiplyDigits([4], 100, 10)).toEqual([4, 0, 0]);
- expect(multiplyDigits([12], 100, 16)).toEqual([4, 11, 0]);
+ expect(multiplyDigits([1], 100, 2)).toEqual([0, 0, 1, 0, 0, 1, 1]);
+ expect(multiplyDigits([5], 100, 8)).toEqual([4, 6, 7]);
+ expect(multiplyDigits([4], 100, 10)).toEqual([0, 0, 4]);
+ expect(multiplyDigits([12], 100, 16)).toEqual([0, 11, 4]);
});
it('multiplies by 1000', () => {
- expect(multiplyDigits([1], 1000, 2)).toEqual([1, 1, 1, 1, 1, 0, 1, 0, 0, 0]);
- expect(multiplyDigits([5], 1000, 8)).toEqual([1, 1, 6, 1, 0]);
- expect(multiplyDigits([4], 1000, 10)).toEqual([4, 0, 0, 0]);
- expect(multiplyDigits([12], 1000, 16)).toEqual([2, 14, 14, 0]);
+ expect(multiplyDigits([1], 1000, 2)).toEqual([0, 0, 0, 1, 0, 1, 1, 1, 1, 1]);
+ expect(multiplyDigits([5], 1000, 8)).toEqual([0, 1, 6, 1, 1]);
+ expect(multiplyDigits([4], 1000, 10)).toEqual([0, 0, 0, 4]);
+ expect(multiplyDigits([12], 1000, 16)).toEqual([0, 14, 14, 2]);
});
});