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;
这是为了一些代码战士的事情。
我尝试将两个添加的数字翻译成二进制文件(当我开始时没有知道num.ToString(2))我成功地做了...向后。
我在堆栈上找到了一些帮助来扭转输出的帮助,但当然并没有让人感到非常满意。我还从堆栈中获取了帮助,替换了字符串值并尝试修改它们,但是当它们被触摸时,事情很快就会向南移动。
如果我要添加a = 2和b = 2(二进制为4和100),输出将是(没有我的反向函数)001.我只是不能理解为什么会放置零在前面的线条。我怀疑它是递归函数的东西。
感谢任何帮助!
编辑:抱歉拒绝编辑!我不知道我是怎么做到的,根本不是故意的。
答案 0 :(得分:1)
JavaScript字符串索引从左到右。例如,"abcd".charAt(1)
为'b'
。
在tryToAdd
函数中,使用x
作为要替换的二进制字符串中数字的索引。如果你改变你的定义以通过从字符串长度中减去它来反转该索引,那么它将无需反转即可工作:
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;
请注意,我也摆脱了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>