diff --git a/Bit-Manipulation/test/IsPowerOfTwo.test.js b/Bit-Manipulation/test/IsPowerOfTwo.test.js index 2ad0f3742..30539f5e5 100644 --- a/Bit-Manipulation/test/IsPowerOfTwo.test.js +++ b/Bit-Manipulation/test/IsPowerOfTwo.test.js @@ -1,4 +1,4 @@ -import {IsPowerOfTwo} from '../IsPowerOfTwo' +import { IsPowerOfTwo } from '../IsPowerOfTwo' test('Check if 0 is a power of 2 or not:', () => { const res = IsPowerOfTwo(0) diff --git a/Conversions/BinaryToHex.js b/Conversions/BinaryToHex.js new file mode 100644 index 000000000..60c64bde4 --- /dev/null +++ b/Conversions/BinaryToHex.js @@ -0,0 +1,59 @@ +const pad = (num, padlen) => { + var pad = new Array(1 + padlen).join(0) + return (pad + num).slice(-pad.length) +} + +const hexLookup = (bin) => { + let binary = bin + if (binary.length < 4) { + binary = pad(binary, 4) + } + switch (binary) { + case '0000': return '0' + case '0001': return '1' + case '0010': return '2' + case '0011': return '3' + case '0100': return '4' + case '0101': return '5' + case '0110': return '6' + case '0111': return '7' + case '1000': return '8' + case '1001': return '9' + case '1010': return 'A' + case '1011': return 'B' + case '1100': return 'C' + case '1101': return 'D' + case '1110': return 'E' + case '1111': return 'F' + } +} +const binaryToHex = (binaryString) => { + /* + Function for convertung Binary to Hex + + 1. The conversion will start from Least Significant Digit (LSB) to the Most Significant Bit (MSB). + 2. We divide the bits into sections of 4-bits starting from LSB to MSB. + 3. If the MSB get less than 4 bits, then we pad 0s to the front of it. + + For Example: + Binary String = '1001101' + + 1. Divide it to 2 parts => ['100', '1101'] + 2. Pad 0s the MSB so it'll be => ['0100', '1101'] + 3. Use the lookup table and merge them, therefore the result is 4D. + + */ + + let result = '' + binaryString = binaryString.split('') + for (let i = binaryString.length - 1; i >= 0; i = i - 4) { + if (i >= 3) { + result += hexLookup(binaryString.slice(i - 3, i + 1).join('')) + } else { + result += hexLookup(binaryString.slice(0, i + 1).join('')) + } + } + return result.split('').reverse().join('') +} + +export default binaryToHex diff --git a/Conversions/TemperatureConversion.js b/Conversions/TemperatureConversion.js index 75a7d69aa..8bf9130b1 100644 --- a/Conversions/TemperatureConversion.js +++ b/Conversions/TemperatureConversion.js @@ -40,8 +40,7 @@ const fahrenheitToRankine = (fahrenheit) => { const kelvinToCelsius = (kelvin) => { // Wikipedia reference: https://en.wikipedia.org/wiki/Kelvin // Wikipedia reference: https://en.wikipedia.org/wiki/Celsius - return Math.round((kelvin) - 273.15) - + return Math.round((kelvin) - 273.15) } const kelvinToFahrenheit = (kelvin) => { @@ -53,7 +52,7 @@ const kelvinToFahrenheit = (kelvin) => { const kelvinToRankine = (kelvin) => { // Wikipedia reference: https://en.wikipedia.org/wiki/Kelvin // Wikipedia reference: https://en.wikipedia.org/wiki/Rankine_scale - return Math.round(( (kelvin) * 9 / 5)) + return Math.round(((kelvin) * 9 / 5)) } const rankineToCelsius = (rankine) => { diff --git a/Conversions/test/BinaryToHex.test.js b/Conversions/test/BinaryToHex.test.js new file mode 100644 index 000000000..85679bb39 --- /dev/null +++ b/Conversions/test/BinaryToHex.test.js @@ -0,0 +1,19 @@ +import binaryToHex from '../BinaryToHex' + +describe('BinaryToHex', () => { + it('expects to return correct hexadecimal value', () => { + expect(binaryToHex('1000')).toBe('8') + }) + + it('expects to return correct hexadecimal value for more than one hex digit', () => { + expect(binaryToHex('11101010')).toBe('EA') + }) + + it('expects to return correct hexadecimal value for padding-required binary', () => { + expect(binaryToHex('1001101')).toBe('4D') + }) + + it('expects to return correct hexadecimal value, matching (num).toString(16)', () => { + expect(binaryToHex('1111')).toBe(parseInt('1111', 2).toString(16).toUpperCase()) + }) +})