Для тех, у кого нет BigInt, вот решение для преобразования в двоичное с помощью евклидова деления:
let txt ='10000000000000041'
, bin = GetBinary(txt)
;
console.log('Base 10 = ', txt )
console.log('Base 2 = ', bin )
console.log('number of digits on 1 = ', bin.replace(/0/g,'').length )
function GetBinary(strNum)
{
let Bin = ''
, val = strNum
, Rep = null
;
for(let l=0;l<200;l++) // loop limitation to 200 by security
{
Rep = Div_2(val)
val = Rep.R
Bin = Rep.D + Bin
if (val==='') break;
}
if (val!=='') console.log( 'too much loops for conversion')
return Bin
}
function Div_2(sNum)
{
let D = R = '' // dividande, results
, d = x = r = 0 // temp vals
;
for(let p=0;p<sNum.length;p++)
{
D += sNum.charAt(p)
d = parseInt(D,10)
if ( d < 2 ) R += '0'
else
{
x = Math.trunc(d / 2)
r = d % 2
D = r.toString(10)
R += x.toString(10)
}
}
R = R.replace(/\b0+/g, '') // remove leading zeros
D = parseInt(D,10).toString() // .except the last one
return { R, D }
}
[править = исправлены незначительные ошибки + информация]
информация: максимальное количество полезных циклов (в GetBinary () ), равно
Math.ceil(Math.log2(Math.pow(10,n)))
, где n
- количество цифр в базе 10.
Здесь приведены «объяснения»:
Существует ли формула для расчета или оценкиколичество цифр двоичного целого числа?
(спасибо Jaromanda X )