将二进制转换为十进制并返回的javascript程序

将二进制转换为十进制并返回的javascript程序,javascript,Javascript,我试过这个 function binToDec(num) { let dec = 0; for(let i = 0; i < num.length; i++) { if(num[num.length - (i + 1)] === '1') { dec += 2 ** i; } } return dec; } console.log(binToDec('1010')); function binTo

我试过这个

function binToDec(num) {
    let dec = 0; 
    for(let i = 0; i < num.length; i++) {
        if(num[num.length - (i + 1)] === '1') {
            dec += 2 ** i;
        }
    }
    return dec;
}

console.log(binToDec('1010'));
function binToDec(num) {
    let bin = parseInt(num, 2);
    return bin;
}
console.log(binToDec(1010));
我知道这也行,但我不寻找这个答案


谢谢您的帮助。

我只是从字符串的最后一个字符开始,并将此位置的值添加到结果中

函数binToDec(num){
设dec=0;
for(设i=0;i
说明 想想10进制是如何工作的

909=900+9
= (9 *   100) + (0 *    10) + (9 *     1)
= (9 * 10**2) + (0 * 10**1) + (9 * 10**0)
如您所见,以10为基数的自然数可视为一个总和,其中每个项的形式如下:

数字*基**数字位置
这适用于任何基础:

base 2:0b101=(0b1*2**2)+(0b0*2**1)+(0b1*2**0)
基16:0xF0F=(0xF*16**2)+(0x0*16**1)+(0xF*16**0)
因此,这里有一个自然数的可能抽象:

function natural_number (base, digits) {
  var sum = 0;
  for (var i = 0; i < digits.length; i++) {
    digit = digits[i];
    digit_position = digits.length - (i + 1);
    sum += digit * base**digit_position;
  }
  return sum;
}
这相当于:

if (num[num.length - (i + 1)] === '1') {
  dec += 2 ** i;
}
你明白了吗?:-)

可供替代的 您觉得不适合使用求幂运算符(
**
)?有一个变通办法。你有没有注意到一个数字乘以10只不过是将它的数字向左移动一次而已

909*10=9090
实际上,将一个数字向左移动归结为将该数字乘以其基数:

number*=base
这适用于任何基础:

base 2:0b11*2=0b110
基数16:0xBEE*16+0xF=0xBEE0+0xF=0xBEEF
在此基础上,我们可以构建一个将数字数组转换为数字的算法。以base 10中的
[9,0,9]
作为输入的执行跟踪如下所示:

init | 0 | n=0
加9 | 9 | n+=9
移位| 90 | n*=10
加上0 | 90 | n+=0
移位| 900 | n*=10
加9 | 909 | n+=9
下面是一个可能的实现:

function natural_number (base, digits) {
  var n = 0;
  for (var i = 0; i < digits.length; i++) {
    n += digits[i];
    if (i + 1 < digits.length) {
      n *= base;
    }
  }
  return n;
}
然后展开此表达式:

((0+9)*10+0)*10+9)
= (0 + 9) * 10 * 10 + 0 * 10 + 9
= 9 * 10 * 10 + 0 * 10 + 9
= 9 * 10**2 + 0 * 10**1 + 9 * 10**0
你认识前面讨论的等式吗?:-)

奖金 反向功能:

function explode_natural_number (base, number) {
  var remainder, exploded = [];
  while (number) {
    remainder = number % base;
    exploded.unshift(remainder);
    number = (number - remainder) / base;
  }
  return exploded.length ? exploded : [0];
}
|爆炸自然数(2,5)
< | [1, 0, 1]
>|分解自然数(3,5)//基数3(5=1*3**1+2*3**0):-)
< | [1, 2]
>|爆炸自然数(16,自然数(16,[11,14,14,15])//0xBEEF
< | [11, 14, 14, 15]
字符串到数字和数字到字符串:

function parse_natural_number (number, base) {
  var ZERO = 48, A = 65; // ASCII codes
  return natural_number(base, number.split("").map(function (digit) {
    return digit.toUpperCase().charCodeAt(0);
  }).map(function (code) {
    return code - (code < A ? ZERO : A - 10);
  }));
}

function stringify_natural_number (number, base) {
  var ZERO = 48, A = 65; // ASCII codes
  return String.fromCharCode.apply(
    String, explode_natural_number(base, number).map(function (digit) {
      return digit + (digit < 10 ? ZERO : A - 10);
    })
  );
}
10月至12月(“10”) < | 8 >|数字至12月(“010”) < | 8 > | 010 // :-) < | 8
| dec|u|u|bin(8)
< | "1000"

很抱歉我的评论太晚了,但是可以将数字记录为数字而不是字符串,并且仍然返回true,因为当我将“1010”更改为1010时,它返回0您想要哪个
true
呢?在哪里?
return ((0 + 9) * 10 + 0) * 10 + 9;
function explode_natural_number (base, number) {
  var remainder, exploded = [];
  while (number) {
    remainder = number % base;
    exploded.unshift(remainder);
    number = (number - remainder) / base;
  }
  return exploded.length ? exploded : [0];
}
function parse_natural_number (number, base) {
  var ZERO = 48, A = 65; // ASCII codes
  return natural_number(base, number.split("").map(function (digit) {
    return digit.toUpperCase().charCodeAt(0);
  }).map(function (code) {
    return code - (code < A ? ZERO : A - 10);
  }));
}

function stringify_natural_number (number, base) {
  var ZERO = 48, A = 65; // ASCII codes
  return String.fromCharCode.apply(
    String, explode_natural_number(base, number).map(function (digit) {
      return digit + (digit < 10 ? ZERO : A - 10);
    })
  );
}
function bin_to_dec (number) {
  return parse_natural_number(number, 2);
}

function oct_to_dec (number) {
  return parse_natural_number(number, 8);
}

function dec_to_dec (number) {
  return parse_natural_number(number, 10);
}

function hex_to_dec (number) {
  return parse_natural_number(number, 16);
}

function num_to_dec (number) {
  switch (number[0] + number[1]) {
    case "0b" : return bin_to_dec(number.slice(2));
    case "0x" : return hex_to_dec(number.slice(2));
    default : switch (number[0]) {
      case "0" : return oct_to_dec(number.slice(1));
      default : return dec_to_dec(number);
    }
  }
}
function dec_to_bin (number) {
  return stringify_natural_number(number, 2);
}