Skip to content
Open
Show file tree
Hide file tree
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
85 changes: 50 additions & 35 deletions Maths/IsEven.js
Original file line number Diff line number Diff line change
@@ -1,48 +1,63 @@
/*
* Even Number: https://simple.wikipedia.org/wiki/Even_number
/**
* @license GPL-3.0 or later
*
* function to check if number is even
* return true if number is even
* else false
* @description Checking if number is even
*/

/**
* @function isEven
* @description - Checking if number is even using divisibility by 2
* @function isEven
* @description Checking if number is even
*
* If the division: number / 2 results in remainder being 0
* the number is even, otherwise it's odd
*
* If number is divisible by 2 i.e remainder = 0, then it is even
* therefore, the function will return true
* @param {number} number - Value to check
* @return {boolean} True if number is even else False
*
* If number is not divisible by 2 i.e remainder != 0, then it is not even i.e odd
* therefore, the function will return false
* @param {number} number
* @return {boolean}
* @see https://simple.wikipedia.org/wiki/Even_number to get
* more details on even numbers
*/
export const isEven = (number) => number % 2 === 0
const isEven = (number) => {
if (typeof number !== 'number' || Number.isNaN(number))
throw new TypeError('Argument is Not a Number')

return Boolean(number % 2) === false
}

/**
* @function isEvenBitwise
* @description - Checking if number is even using bitwise operator
* Bitwise AND (&) compares the bits of the 32
* bit binary representations of the number and
* returns a number after comparing each bit:
* @function isEvenBitwise
* @description Checking if number is even using bitwise
* operation
*
* 0 & 0 -> 0
* 0 & 1 -> 0
* 1 & 0 -> 0
* 1 & 1 -> 1
* Bitwise AND (&) compares the bits of the 32 bit binary
* representations of the number and returns a number after
* comparing each bit:
* 0 & 0 -> 0
* 0 & 1 -> 0
* 1 & 0 -> 0
* 1 & 1 -> 1
* For odd numbers, the LSB (Least Significant Bit) will be 1
* and for even numbers, the LSB will be 0. As the number is
* compared to one, all other bits will become 0
* 0 1 1 1 = 7
* & & & &
* 0 0 0 1 = 1
* ↓ ↓ ↓ ↓
* 0 0 0 1 = odd since LSB is equal to 1
*
* For odd numbers, the last binary bit will be 1
* and for even numbers, the last binary bit will
* be 0.
* @param {number} number - Value to check
* @return {boolean} True if number is even else False
*
* As the number is compared with one, all the
* other bits except the last will become 0. The
* last bit will be 0 for even numbers and 1 for
* odd numbers, which is checked with the use
* of the equality operator.
* @param {number} number
* @returns {boolean}
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_AND
* @see https://en.wikipedia.org/wiki/Bit_numbering to get
* details on LSB (Least Significant Bit) and
* https://en.wikipedia.org/wiki/Bitwise_operation#AND
* to get details on bitwise AND operator
*/
export const isEvenBitwise = (number) => (number & 1) === 0
const isEvenBitwise = (number) => {
if (typeof number !== 'number' || Number.isNaN(number))
throw new TypeError('Argument is Not a Number')

return Boolean(number & 1) === false
}

export { isEven, isEvenBitwise }
34 changes: 30 additions & 4 deletions Maths/test/IsEven.test.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,51 @@
import { isEven, isEvenBitwise } from '../IsEven'

describe('Testing isEven function', () => {
it('should return if the number is even or not', () => {
const randomNumber = Math.floor(Math.random() * 1999999) - 999999

it('will test a value which should be even: 4', () => {
const isEvenNumber = isEven(4)
expect(isEvenNumber).toBe(true)
})

it('should return if the number is even or not', () => {
it("will test a value which shouldn't be even: 7", () => {
const isEvenNumber = isEven(7)
expect(isEvenNumber).toBe(false)
})

it(`will test a random value: ${randomNumber}`, () => {
const isEvenNumber = isEven(randomNumber)
expect(isEvenNumber).toBe(Boolean(randomNumber % 2) === false)
})

it('will test a TypeError for non-number inputs', () => {
expect(() => isEven('10')).toThrow(TypeError)
expect(() => isEven(null)).toThrow(TypeError)
expect(() => isEven(undefined)).toThrow(TypeError)
expect(() => isEven(NaN)).toThrow(TypeError)
})
})

describe('Testing isEvenBitwise function', () => {
it('should return if the number is even or not', () => {
const randomNumber = Math.floor(Math.random() * 1999999) - 999999

it('will test a value which should be even: 6', () => {
const isEvenNumber = isEvenBitwise(6)
expect(isEvenNumber).toBe(true)
})

it('should return if the number is even or not', () => {
it("will test a value which shouldn't be even: 3", () => {
const isEvenNumber = isEvenBitwise(3)
expect(isEvenNumber).toBe(false)
})

it(`will test a random value: ${randomNumber}`, () => {
const isEvenNumber = isEvenBitwise(randomNumber)
expect(isEvenNumber).toBe(Boolean(randomNumber & 1) === false)
})

it('will test a TypeError for non-number inputs', () => {
expect(() => isEvenBitwise('10')).toThrow(TypeError)
expect(() => isEvenBitwise({})).toThrow(TypeError)
})
})