Skip to content

Commit

Permalink
feat(bitwise): Function to check if a number is positive (trekhleb#204)
Browse files Browse the repository at this point in the history
  • Loading branch information
adityahiran authored and trekhleb committed Sep 14, 2018
1 parent 861e0e9 commit ab7755a
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 1 deletion.
23 changes: 23 additions & 0 deletions src/algorithms/math/bits/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
10 changes: 10 additions & 0 deletions src/algorithms/math/bits/__test__/isPositive.test.js
Original file line number Diff line number Diff line change
@@ -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);
});
});
13 changes: 13 additions & 0 deletions src/algorithms/math/bits/isPositive.js
Original file line number Diff line number Diff line change
@@ -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;
}
3 changes: 2 additions & 1 deletion src/algorithms/math/bits/multiply.js
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -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();
}

0 comments on commit ab7755a

Please sign in to comment.