Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Sep 14, 2018
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions src/algorithms/math/bits/README.md
Original file line number Diff line number Diff line change
@@ -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.
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.
@@ -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();
}