Skip to content

Instantly share code, notes, and snippets.

@ekoneko
Created April 18, 2018 08:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ekoneko/734a10cc855ea22643ba653aedff52ca to your computer and use it in GitHub Desktop.
Save ekoneko/734a10cc855ea22643ba653aedff52ca to your computer and use it in GitHub Desktop.
Semver to Number
const defaultBitLength = 6
const maxBitLength = 16
function transformSemver2Number (semver: string): string {
const [n1, n2, n3] = semver.split('.').map(Number)
const maxNum = Math.max(n1, n2, n3)
const minBitLength = Math.ceil(Math.log2(maxNum))
const bitLength = Math.max(minBitLength, defaultBitLength)
if (bitLength > maxBitLength) {
throw new Error('semver too big!')
}
const numberVersion = (n1 << bitLength * 2) + (n2 << bitLength) + n3
return (bitLength - defaultBitLength + 1).toString() + numberVersion
}
function transformNumber2Semver (numString: string) {
const bitLength = +numString[0] + defaultBitLength - 1
const numberVersion = +numString.slice(1)
const n3 = numberVersion & (1 << bitLength) - 1
const n2 = numberVersion >> bitLength & (1 << bitLength) - 1
const n1 = numberVersion >> bitLength * 2 & (1 << bitLength) - 1
return `${n1}.${n2}.${n3}`
}
console.log(transformSemver2Number('1.1.1')) // 14161
console.log(transformSemver2Number('1.2.3')) // 14227
console.log(transformSemver2Number('1.4.3')) // 14355
console.log(transformSemver2Number('2.0.0')) // 18192
console.log(transformSemver2Number('4.3.1')) // 116577
console.log(transformSemver2Number('255.255.255')) // 316777215
console.log(transformSemver2Number('1.999.3')) // 32071555
console.log(transformNumber2Semver('14227')) // 1.2.3
console.log(transformNumber2Semver('316777215')) // 999.999.999
console.log(transformNumber2Semver('52071555')) // 1.999.3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment