feat(bitwise): Function to check if a number is positive (#204)

This commit is contained in:
ADITYA 2018-09-14 00:42:42 -04:00 committed by Oleksii Trekhleb
parent 861e0e9243
commit ab7755aad7
4 changed files with 48 additions and 1 deletions

View File

@ -51,6 +51,29 @@ isEven: true
> See [isEven.js](isEven.js) for further details.
#### isPositive
This method determines if the number provided is positive.
It is based on the fact that all positive numbers have their last
left bit to be set to 0. However, if the number provided is zero
or negative zero, it should still return false.
```text
Number: 1 = 0b0001
isPositive: true
Number: -1 = -0b0001
isPositive: false
Number: 0 = 0b0000
isPositive: false
Number: -0 = 0b0000
isPositive: false
```
> See [isPositive.js](isPositive.js) for further details.
#### Multiply By Two
This method shifts original number by one bit to the left.

View File

@ -0,0 +1,10 @@
import isPositive from '../isPositive';
describe('isPositive', () => {
it('should detect if a number is positive', () => {
expect(isPositive(0)).toBe(false);
expect(isPositive(-0)).toBe(false);
expect(isPositive(1)).toBe(true);
expect(isPositive(-1)).toBe(false);
});
});

View File

@ -0,0 +1,13 @@
/**
* @param {number} number
* @return {boolean}
*/
export default function isPositive(number) {
// Zero is neither a positive nor a negative number
if (number === 0) {
return false;
}
// The most signification bit can be used to determine whether .
return ((number >> 31) & 1) === 0;
}

View File

@ -1,6 +1,7 @@
import multiplyByTwo from './multiplyByTwo';
import divideByTwo from './divideByTwo';
import isEven from './isEven';
import isPositive from './isPositive';
/**
* Multiply two signed numbers using bitwise operations.
@ -34,7 +35,7 @@ export default function multiply(a, b) {
const multiplyByOddNegative = () => multiply(multiplyByTwo(a), divideByTwo(b + 1)) - a;
const multiplyByEven = () => multiply(multiplyByTwo(a), divideByTwo(b));
const multiplyByOdd = () => (b > 0 ? multiplyByOddPositive() : multiplyByOddNegative());
const multiplyByOdd = () => (isPositive(b) ? multiplyByOddPositive() : multiplyByOddNegative());
return isEven(b) ? multiplyByEven() : multiplyByOdd();
}