如何在JavaScript中添加两个数字"不使用`+`或`-`运算符"?

时间:2017-01-04 03:25:51

标签: javascript algorithm

  

▶注意:

     

这不是一个基本的"如何在JavaScript中添加数字"问题

     

请在downvoting之前仔细阅读问题

我知道使用+符号进行添加的替代方法是执行以下操作:

int add(int a, int b)
{
     if(b == 0)
         return sum;
     sum = a ^ b;
     carry = (a & b) << 1;
     return add(sum,carry);
}

但我有两个问题:

  • 这是C ++,而不是JavaScript。这是否支持JavaScript?
  • 很明显,整个技巧都在^ & <<,但我不知道如何在JavaScript中开始寻找它们,因为我不知道他们叫什么 我应该用什么谷歌搜索?

我试着用JavaScript编写这个...但似乎我错过了一些东西

var getSum = function(a, b) {
  return (a ^ b, (a & b) << 1)
};

6 个答案:

答案 0 :(得分:12)

我们将使用bitwise operators并使用recursion

我们在资源很少的情况下使用此方法read more when to use this method!

var getSum = function(a, b) {
    if (b == 0) {
        return a;
    } else {
        return getSum(a ^ b, (a & b) << 1)
    }
};

@PatrickRoberts建议的ES6单线解决方案

const getSum = (a,b) => b ? getSum(a ^ b, (a & b) << 1) : a;

另一种解决方案:

2-数组技术Array.prototype.fill()

const getSum = (a, b) => {
  const firstArr = new Array(a).fill(true);
  const secondArr = new Array(b).fill(true);
  return firstArr.concat(secondArr).length
}

3-解决方法use加号without writing it

const getSum = (a, b) => eval(''.concat(a).concat(String.fromCharCode(0x2B)).concat(b));

答案 1 :(得分:3)

好吧,我正在回答标题中清楚描述的问题。没有+和没有-操作正确..?然而......不是按位而是用纯数学应该是我认为的有效答案。

var x   = 1,
    y   = 2,
    sum = Math.log2(2**x * 2**y);
console.log(sum);

答案 2 :(得分:2)

const add = (a, b) => new Function('a', 'b', `return ${a} ${String.fromCharCode(43)} ${b}`)(a, b);

答案 3 :(得分:1)

我们可以使用while循环实现相同的功能。我们必须将进位向左移动,并将其添加到二进制数的总和中,直到没有进位。 (因为我们遵循的做法是在小数点后加。)

function getSum(a, b){
  while(b!=0){
    var carry = a&b;  //calculate if is there any carry we need to add
    a = a^b;   // a is used to hold the sum
    b = carry<<1;  //b is used to hold left shift carry
  }
  return a;
}

document.write(getSum(7, 5))

答案 4 :(得分:0)

可以使用数组结构来执行求和运算。

<tr *ngFor="let plans of PlanList; let index" (click)="lastClicked = index" [ngClass]="{'btn-success': index == lastClicked}" >
  <td class="text-primary">{{plans.typename}} </td>
  <td><a (click)="criticalSelect(...)" class="btn btn-primary text-white">${{plans.plan1}}</a></td>
  <td><a (click)="criticalSelect(...)" class="btn btn-primary text-white">${{plans.plan2}}</a></td>
  <td><a (click)="criticalSelect(...)" class="btn btn-primary text-white">${{plans.plan3}}</a></td>
  <td><a (click)="criticalSelect(...)" class="btn btn-primary text-white">${{plans.plan4}}</a></td>
</tr>

每个输入都被强制转换为一个数组,例如,一个值为 5 的输入将被强制转换为一个包含 5 个元素的数组。在强制两个输入后,数组被连接成一个数组。返回最终数组的长度,通过除以100处理十进制值之和。

现在,让我们尝试防范无效输入情况,例如 function getSum(a, b){ return Array(a).concat(Array(b)).length / 100; } 或虚假值。

strings

答案 5 :(得分:-1)

与@PatrickRoberts建议的方法相同,但没有递归:

const add = (a, b) => {
  let c;
  while (a !== 0) {
    c = b & a;
    b = b ^ a;
    c = c << 1;
    a = c;
  }
  return b;
};