二进制到十进制Javascript

Binary to Decimal Javascript

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

这段代码应该接受一个字符串("100101")并以十进制形式输出结果。我不太确定为什么它不起作用。如有任何帮助,不胜感激。

function BinaryConverter(str) { 
 var num=str.split("");
 var powers=[];
 var sum=0;
  for(var i=0;i<num.length;i++){
   powers.push(i);
}
 for(var i=powers.length-1;i>=0;i--){
  for(var j=0;j<num.length;i++){
   sum+=Math.pow(2,i)*num[j];
  }
 }
 return sum;
};
对于输入"011",它应该做(2^2*0 +2^1*1 +2^0*1)=3,但它返回14。有人知道我哪里出错了吗?
    function BinaryConverter(str) { 
     var num=str.split("");
     var powers=[];
     var sum=0;
     for(var i=0;i<num.length;i++){
       powers.push(i);
     }
     for(var i=powers.length-1;i>=0;i--){
      for(var j=0;j<num.length;j++){
       sum+=Math.pow(2,i)*num[j];
      }
     }
     return sum;
    };

两个嵌套的for循环有一个问题。第一个是减去一个i,而第二个是增加一个i,永远创建一个永无止境的循环。

你的代码应该是这样的:

    function BinaryConverter(str) { 
        var num=str.split("");
        var powers=[];
        var sum=0;
        var numlength=num.length;
        for(var i=0;i<num.length;i++){
            powers.push(i);
        }
        for(var i=powers.length-1;i>=0;i--){
            sum+=Math.pow(2,i)*num[numlength-i-1];
        }
        return sum;
   };
我认为你不需要嵌套的for循环

如果您出于某种原因(例如,因为作业问题说您不能)不想对parseInt()这样做,您可以这样做,而无需为每个数字调用Math.pow()的复杂性和费用:

function parseBinary(str) {
  var i, value = 0;
  for (i = 0; i < str.length; ++i)
    value = value * 2 + +str[i];
  return value;
}

不检查无效的输入字符串

ace040686在他的回答中只把pow(2,i)num[len-1-i]倒过来,否则就是正确的。你也在按0…str。length-1对于powers来说是不必要的,这些都是隐式索引。

function convertNaive(str) {
  var num = str.split("");
  var len = num.length;
  var sum = 0;
  for(var i = len - 1; i >= 0; --i)
    sum += Math.pow(2, len - 1 - i) * num[i];
  return sum;
}

您可以稍微改进一下,以避免不必要的数组,特别是Math.pow:

function convertImproved(str) {
  var len = str.length;
  var sum = 0;
  for(var i = 0, fac = 1; i < len; ++i, fac *= 2)
    sum += fac * str[len - 1 - i];
  return sum;
}

你自己试试:

var input = "100101";
var logNode = document.getElementById("log");
function log(line) {
  var text = document.createTextNode(line);
  var node = document.createElement("p");
  node.appendChild(text);
  logNode.appendChild(node);
}
function convertNaive(str) {
  var num = str.split("");
  var len = num.length;
  var sum = 0;
  for(var i = len - 1; i >= 0; --i)
    sum += Math.pow(2, len - 1 - i) * num[i];
  return sum;
}
function convertImproved(str) {
  var len = str.length;
  var sum = 0;
  for(var i = 0, fac = 1; i < len; ++i, fac *= 2)
    sum += fac * str[len - 1 - i];
  return sum;
}
log("input: " + input);
log("parseInt(input, 2): " + parseInt(input, 2));
log("convertNaive(input): " + convertNaive(input));
log("convertImproved(input): " + convertImproved(input));
<div id="log" />

这是javascript中二进制到十进制的简单实现。

main();
function main() {
    let binaryInput = 10000100111;
    let decimalOutput = binaryTodecimal(binaryInput);
    console.log(decimalOutput);
}
function binaryTodecimal(input) {
    let inputString = input.toString();
    let result = 0;
    let exponent = 1;
    let currentBit = 0;
    for (let i = inputString.length - 1; i >= 0; i--) {
        currentBit = parseInt(inputString[i]);
        currentBit *= exponent;
        result += currentBit;
        exponent *= 2;
    }
    return result;
}