我的Javascript输出相反,我无法找出原因

时间:2016-05-24 14:28:12

标签: javascript binary



    function addBinary(a, b) {
      var num = a + b;
      var str = "";

      function tryToAdd(x) {
        if (str.charAt(x) == 0 || !str || str.charAt(x) == null) {
          if (x == str.length) {
            str += "1";
          } else {
            str = str.substr(0, x) + "1" + str.substr(1 + x);
          }
        } else {
          str = str.substr(0, x) + "0" + str.substr(1 + x);
          tryToAdd(x + 1);
        }
      }
      for (i = 0; i < num; i++) {
        tryToAdd(0);
      }

      function reverse(s) {
          return s.split("").reverse().join("");
        } // reverse my string because I don't know why it's reversed in the first place lol
      var newStr = reverse(str);
      return newStr;
    }

    console.log(addBinary(1, 5));
&#13;
&#13;
&#13;

这是为了一些代码战士的事情。

我尝试将两个添加的数字翻译成二进制文件(当我开始时没有知道num.ToString(2))我成功地做了...向后。

我在堆栈上找到了一些帮助来扭转输出的帮助,但当然并没有让人感到非常满意。我还从堆栈中获取了帮助,替换了字符串值并尝试修改它们,但是当它们被触摸时,事情很快就会向南移动。

如果我要添加a = 2和b = 2(二进制为4和100),输出将是(没有我的反向函数)001.我只是不能理解为什么会放置零在前面的线条。我怀疑它是递归函数的东西。

感谢任何帮助!

编辑:抱歉拒绝编辑!我不知道我是怎么做到的,根本不是故意的。

2 个答案:

答案 0 :(得分:1)

JavaScript字符串索引从左到右。例如,"abcd".charAt(1)'b'

tryToAdd函数中,使用x作为要替换的二进制字符串中数字的索引。如果你改变你的定义以通过从字符串长度中减去它来反转该索引,那么它将无需反转即可工作:

&#13;
&#13;
function addBinary(a,b){
    var num = a+b;
    var str = "";

    function tryToAdd(y){
        var x = str.length - y - 1; // correct for left-to-right strings
        if (str.charAt(x) == 0 || str.charAt(x) == null) {
            str = str.substr(0, x) + "1" + str.substr(1 + x);
        }
        else {
            str = str.substr(0, x) + "0" + str.substr(1 + x);
            tryToAdd(y+1); // recur on y, not x
        }
    }
    for (var i = 0; i < num; i++) {
        tryToAdd(0);
    } 
    return str;
}

console.log(addBinary(1,5))
&#13;
&#13;
&#13;

请注意,我也摆脱了x == str.length条件,因为它似乎没有做任何有用的事情。

我认为您只是出于学习目的这样做,但我仍然想确保您知道可以在JavaScript中将数字转换为二进制字符串,如下所示:num.toString(2)

答案 1 :(得分:0)

这是另一种方式与@DaoWen做同样的简洁回答。
我把它留在这里,因为它需要时间来编辑,它正在工作。
有一天可以有所帮助。

无论如何,将数字转换为二进制字符串的正确方法是:num.toString(2),正如@DaoWen所提到的那样。

我插入了很多console.log()来查看每次迭代 我使用jQuery只是为了使用一些数字字段... 也可以使用getElementById ...
小提琴:https://jsfiddle.net/Bes7weB/oxnhp03L/

<!-- jQuery -->
    <script src="https://code.jquery.com/jquery-1.12.0.min.js"></script>

    <style>


    </style>

    a: <input type="number" id="a"><br>
    b: <input type="number" id="b"><br>
    <br>
    <input type="button" id="add" value="Add a and b"><br>
    <br>
    result: <input type="text" id="response"><br>

<script>

$("#add").click(function(){
    addBinary($("#a").val(),$("#b").val())
});


function addBinary(a,b){
    console.log("a:"+a+" b:"+b);
    var num = parseInt(a)+parseInt(b);
    console.log("num: "+num);
    var str = "0";

    function tryToAdd(x){
        console.log("tryToAdd() iteration x: "+x+" - Since zero based, the number is: "+parseInt(x+1));
        if (str.charAt(str.length-1) == "0"){                   // IF last digit = 0 --> Change it for a 1
        console.log("Last char is zero.");
                str = str.substr(0, str.length-1) + "1";
        }
        else{                                                   // IF last digit = 1
            LastZero=str.lastIndexOf("0");                      // Check for a 0 somewhere else in the string and retreive position
            console.log("Last zero position: "+LastZero);
            if(LastZero==-1){                                   // If none, place a 1 and turn all digits to 0
                newStr="1";
                console.log("newStrA1: "+newStr);
                for(j=0;j<str.length;j++){
                    newStr+="0";
                    console.log("newStrA2: "+newStr);
                }
                console.log("newStrA3: "+newStr);

            }else{                                              // If a 0 somewhere, find the last.                     
                newStr=str.substr(0,LastZero);                  // keep the first part of the string
                console.log("newStrB1: "+newStr);

                newStr+="1"                                     // Turn this 0 into a 1 
                console.log("newStrB2: "+newStr);

                for(j=1;j<str.length-LastZero;j++){             // And add the remaining digits as 0
                    console.log("Iteration j="+j+", Adding remaining digits as zero.");
                    newStr+="0";
                    console.log("newStrB3: "+newStr);
                }
            }
            str=newStr;
        }
        console.log("------------------------------------------------------------- RESULT: "+str);
        console.log("");
    }


    for (i = 0; i <= num-1; i++){   // Removes 1 to your number, since tryToAdd() iterations are zero based.
        tryToAdd(i);                // Loops! 
    }

    $("#response").val(str);        // Returns the result in an input text.
}
</script>