mirror of
https://github.moeyy.xyz/https://github.com/trekhleb/javascript-algorithms.git
synced 2024-12-26 07:01:18 +08:00
feat(bitwise): Function to check if a number is positive (#204)
This commit is contained in:
parent
861e0e9243
commit
ab7755aad7
@ -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
src/algorithms/math/bits/__test__/isPositive.test.js
Normal file
10
src/algorithms/math/bits/__test__/isPositive.test.js
Normal 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);
|
||||
});
|
||||
});
|
13
src/algorithms/math/bits/isPositive.js
Normal file
13
src/algorithms/math/bits/isPositive.js
Normal 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;
|
||||
}
|
@ -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();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user