二进制到十进制Javascript

时间:2015-08-06 14:52:56

标签: javascript math binary numbers

这段代码应该包含一个字符串(“100101”)并输出十进制的结果。我不太清楚为什么它不起作用。任何帮助都将不胜感激。

before

这是我在下面的更新代码。对于输入“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;i++){
   sum+=Math.pow(2,i)*num[j];
  }
 }
 return sum;
};

4 个答案:

答案 0 :(得分:1)

两个嵌套的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循环

答案 1 :(得分:1)

如果由于某种原因(例如,因为作业问题说不能)而不希望parseInt()这样做,那么你可以做到这一点,而不需要调用{{1}的复杂性和费用}对于每个数字:

Math.pow()

这不会检查无效的输入字符串。

答案 2 :(得分:0)

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" />

答案 3 :(得分:0)

这是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;
}