parseInt 不将十进制转换为二进制

parseInt not converting decimal to binary?

本文关键字:二进制 转换 十进制 parseInt      更新时间:2023-09-26

根据我的理解,二进制数系统使用两个数字的集合,0和1来执行计算。

为什么:

console.log(parseInt("11", 2));返回3而不是00001011?http://www.binaryhexconverter.com/decimal-to-binary-converter

使用 toString(( 代替 parseInt

11..toString(2)
var str = "11";
var bin = (+str).toString(2);
console.log(bin)

根据 JavaScript 的文档:

以下示例都返回 NaN:

parseInt("546", 2);//数字对二进制表示无效

> parseInt(number, base) 返回由number参数以base基数表示的数字的十进制值。

11 在十进制数系统中是 3 的二进制等价物。

var a = {};
window.addEventListener('input', function(e){
  a[e.target.name] = e.target.value;
  console.clear();
  console.log(  parseInt(a.number, a.base)  );
}, false);
<input name='number' placeholder='number' value='1010'>
<input name='base' placeholder='base' size=3 value='2'>

parseInt文档中所述: parseInt(( 函数解析字符串参数并返回指定基数(数学数字系统中的基数(的整数。

因此,它正在做它应该做的事情:将 11 的二进制值转换为 3 的整数值。

如果尝试将 11 的整数值转换为二进制值,则需要使用 Number.toString 方法:

console.log(11..toString(2)); // 1011

.toString(2)应用于Number类型时有效。

255.toString(2)      // syntax error
"255".toString(2);   // 255
var n=255;
n.toString(2);      // 11111111
// or in short
Number(255).toString(2) // 11111111
// or use two dots so that the compiler does
// mistake with the decimal place as in 250.x
255..toString(2)        // 11111111

parseInt(( 函数解析字符串参数并返回指定基数(数学数字系统中的基数(的整数。

所以你告诉系统你想将 11 作为二进制转换为小数。

特别是您所指的网站,如果您仔细观察,它实际上是使用 JS 发出 HTTP GET 以在 Web 服务器端转换它。如下所示:

http://www.binaryhexconverter.com/hesapla.php?fonksiyon=dec2bin&deger=11&pad=false

我发现的用于将十进制字符串转换为二进制的 shortes 方法是:

const input = "54654";
const output = (input*1).toString(2);
print(output);

我认为

您应该了解十进制到二进制转换背后的数学原理。这是javascript中的简单实现。

main();
function main() {
    let input  = 12;
    let result = decimalToBinary(input);
    console.log(result);
}
function decimalToBinary(input) {
    let base           = 2;
    let inputNumber    = input;
    let quotient       = 0;
    let remainderArray = [];
    let resultArray    = [];
    if (inputNumber) {
        while (inputNumber) {
            quotient = parseInt(inputNumber / base);
            remainderArray.push(inputNumber % base);
            inputNumber = quotient;
        }
        for (let i = remainderArray.length - 1; i >= 0; i--) {
            resultArray.push(remainderArray[i]); 
        }
        return parseInt(resultArray.join(''));
    } else {
        return `${input} is not a valid input`;
    }
}

这是一个老问题,但是我有另一个解决方案可能会有所贡献。我通常使用此函数将十进制数转换为二进制:

function dec2bin(dec) {
    return (dec >>> 0).toString(2);
}

dec >>> 0将数字转换为字节,然后调用toString(radix)函数以返回二进制字符串。它简单而干净。

注意:radix用于表示数值。必须是介于 2 和 36 之间的整数。例如:

  • 2 - 数字将显示为二进制值
  • 8 - 数字将显示为八进制值
  • 16 - 数字将显示为十六进制值

function num(n){
  return Number(n.toString(2));
}
console.log(num(5));

这对

我有用:parseInt(Number,original_base(.toString(final_base(

例如:parseInt(32, 10(.toString(2( 用于十进制到二进制的转换。

来源:https://www.w3resource.com/javascript-exercises/javascript-math-exercise-3.php

以下是手动十进制到二进制算法的简洁递归版本:

  • 将十进制数分成两半,并将每个操作的余数聚合在一起,直到值==0并打印连接的二进制字符串
  • 使用 25 的示例: 25/2 = 12(r1(/2 = 6(r0(/2 = 3(r0(/2 = 1(r1(/2 = 0(r1( => 10011 =>
  • 反向 => 11001

    function convertDecToBin(input){
        return Array.from(recursiveImpl(input)).reverse().join(""); //convert string to array to use prototype reverse method as bits read right to left 
        function recursiveImpl(quotient){
            const nextQuotient = Math.floor(quotient / 2); //divide subsequent quotient by 2 and take lower limit integer (if fractional)
            const remainder = ""+quotient % 2; //use modulus for remainder and convert to string
            return nextQuotient===0?remainder:remainder + recursiveImpl(nextQuotient); //if next quotient is evaluated to 0 then return the base case remainder else the remainder concatenated to value of next recursive call    
        }
    }
    

为了更好地理解,我认为您应该尝试自己进行该转换的数学运算。

  • (1( 11/2 = 5
  • (1( 5/2 = 2
  • (0( 2/2 = 1
  • (1( 1/2 = 0

我基于该逻辑创建了一个函数

函数 decimalToBinary(inputNum( {    设二进制 = [];    而 (inputNum> 0( {        if (inputNum % 2 === 1( {            二进制拼接(0,0,1(;            输入数 = (输入数 - 1(/2;        } else {            二进制拼接(0,0,0(;            输入数/= 2;        }    }    二进制 = 二进制.join(''(;    控制台.log(二进制(;}

这是我为获得解决方案所做的:

    function addBinary(a,b) {
 // function that converts decimal to binary
 function dec2bin(dec) {
   return (dec >>> 0).toString(2);
 } 
 var sum = a+b; // add the two numbers together
 return sum.toString(2); //converts sum to binary
} 
addBinary(2, 3);

我首先将十进制数转换为二进制,就像它所说的那样,我在 JavaScript 按位课程下从 w3schools 获得了函数。 然后为了让自己更轻松,我创建了变量"sum"来执行加法,最后,我让 addBinary 函数将总和作为二进制代码返回,然后调用它。 它在CodeWars中通过。 我希望这是有道理的,它对你有帮助。

只需使用 Number(x(.toString(base(。其中基数需要等于 2。

var num1=13;
Number(num1).toString(2)

结果:"1101">

Number(11).toString(2)

结果:"1011">

似乎带有字符串基数的转换(dec >>> 0).toString(2)返回了以错误方向格式化的二进制数。我已经在Chrome中验证了此解决方案。如果有人想手动计算二进制进行验证,请从左到右将与二进制数映射中的1位置相对应的数字相加[1][2][4][8][16][32][64][128] ...

例如:

  • 二进制中的1001010 + 2 + 0 + 8
  • 二进制中的1310111 + 0 + 4 + 8
  • 二进制中的255111111111 + 2 + 4 + 8 + 16 + 32 + 64 + 128
    function dec2bin(dec){
      return (dec >>> 0).toString(2).split('').reverse().join('');
    }

这会将小数转换为二进制:

let num = "1234"
console.log(num.toString(2));

这将给出二进制到十进制:

let num = "10011010010";
console.log(parseInt(num, 2));