mirror of
https://github.moeyy.xyz/https://github.com/trekhleb/javascript-algorithms.git
synced 2024-12-26 23:21: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.
|
> 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
|
#### Multiply By Two
|
||||||
|
|
||||||
This method shifts original number by one bit to the left.
|
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 multiplyByTwo from './multiplyByTwo';
|
||||||
import divideByTwo from './divideByTwo';
|
import divideByTwo from './divideByTwo';
|
||||||
import isEven from './isEven';
|
import isEven from './isEven';
|
||||||
|
import isPositive from './isPositive';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Multiply two signed numbers using bitwise operations.
|
* 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 multiplyByOddNegative = () => multiply(multiplyByTwo(a), divideByTwo(b + 1)) - a;
|
||||||
|
|
||||||
const multiplyByEven = () => multiply(multiplyByTwo(a), divideByTwo(b));
|
const multiplyByEven = () => multiply(multiplyByTwo(a), divideByTwo(b));
|
||||||
const multiplyByOdd = () => (b > 0 ? multiplyByOddPositive() : multiplyByOddNegative());
|
const multiplyByOdd = () => (isPositive(b) ? multiplyByOddPositive() : multiplyByOddNegative());
|
||||||
|
|
||||||
return isEven(b) ? multiplyByEven() : multiplyByOdd();
|
return isEven(b) ? multiplyByEven() : multiplyByOdd();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user