找到补码js有效的解决方案

时间:2017-07-13 22:41:41

标签: javascript algorithm

我得到一个正整数,并询问输出其补数。

即。

Input: 5

Output: 2

说明:5的二进制表示为101(无前导零位),其补码为010。所以我需要输出2

以下解决方案有效但我觉得它不是最有效的算法。任何人都可以发现任何可以改善的方式吗?最有可能使用按位运算符。

/**
 * @param {number} num
 * @return {number}
 */
var findComplement = function(num) {

    var bin = Number(num).toString(2);

    bin = bin.split('');
    var answer = [];

    for(var i = 0; i < bin.length; i++) {
        console.log(bin[i])
        if(bin[i] === '0') {
            answer.push(1);
        } else {
            answer.push(0)
        }
    }

    return parseInt( answer.join(''), 2 );

};

5 个答案:

答案 0 :(得分:0)

这可能不会更快,但它只是一个班轮:

const complement = (n) => n.toString(2).split('').map((e) => e === '0' ? 1 : 0).join('', 2)

答案 1 :(得分:0)

检查功能complement

它是如何工作的?

首先我们使用补码运算符~,但它返回32位结果,因此~5等于4294967290(29 1010总共32位)。接下来我们需要剥离那些前导1,因此我们创建一个与二进制格式相同长度的掩码,即5101)掩码为{{1即111。使用7运算符作为补码和我们的数字,我们得到了正确的结果。

希望很明显:)

代码

您还可以运行代码段进行测试

&
function complement(n) {
   var mask = Math.pow(2, n.toString(2).length) - 1;
   return ~n & mask;
}

答案 2 :(得分:0)

如果我说得对,那么代码应该接近这个:

var findComplement = function(num) {

    /* Skip leading zeros */
    var power;
    for (power = 31; power >= 0 && ((num & (1 << power)) === 0); power--);

    /* Iterate through the rest of the number */
    var result = 0;
    for (var i = 0; i < power; i++) {
        if ((num & (1 << i)) === 0)
            result |= (1 << i);
    }

    return result;
}

然而,有一点我不确定:据我所知Number类型是64位浮点数类型。由于浮点数和整数的表示不同(check this),因此如果查看所有64位,答案可能不是您所期望的。我可能错了,如果是这样的话,请纠正我。

答案 3 :(得分:0)

使用JavaScript的另一种方式。

const findComplement = (num) => {
  return parseInt(
    num
      .toString(2)
      .split('')
      .map((i) => +!+i)
      .join(''),
    2
  );
};

答案 4 :(得分:0)

数字补码的位技巧。

var findComplement = (num) => {
  const mask = parseInt((+num).toString(2).replace(/\d/g, '1'), 2);
  return num ^ mask;
};

console.log(findComplement(5));