2

因此,如果我有一个 number1 和另一个 number2 .. 两个整数,我的方法是否更正了使用按位运算添加两个数字的方法?这对任何测试用例都会出错吗?

public int add(int number1, int number2)
{
int carry = (number1&number2)<<1;
int sum = number1^number2^carry;
return sum;
}
4

4 回答 4

11

全加器

以下是电路设计师如何添加两个数字。翻译一下,左上边双曲线的两个符号是 XOR (^),左平边中间的两个符号是 AND (&),左单曲线的最后一个符号是 OR (| )。

现在,这是您如何使用掩码将其转换为代码的方法,一次一位。

public int add(final int A, final int B) {
    int mask = 1; 
    int sum = 0;
    int carry = 0;

    for (int i = 1; i <= Integer.SIZE; i++) { //JVM uses 32-bit int
        int a = A & mask; //bit selection
        int b = B & mask;

        //sum uses |= to preserve the history,
        //but carry does not need to, so it uses =
        sum |= a ^ b ^ carry; //essentially, is the sum of bits odd?
        carry = ((a & b) | ((a ^ b) & carry)) << 1; //are exactly two of them 1?

        mask <<= 1; //move on to the next bit
    }
    return sum;
}
于 2012-09-04T05:11:24.410 回答
7

是的。这种方法不适用于涉及多个进位的添加。最简单的这种情况是3 + 1;结果,您的函数给出0了。

没有简单的通用解决方案可以解决这个问题——任何解决方案都必须考虑整数的宽度。有关某些方法,请参阅Wikipedia 关于加法的门级实现的文章。

于 2012-09-04T04:51:53.637 回答
2

这是在 JavaScript 中,但在这里。

function add(number1,number2){
    var a = number1,b = number2,c;
    while(b != 0){
        c = a & b;
        a = a ^ b;
        b = c << 1;
    }
    return a;
}

这是一个示例 https://jsfiddle.net/Mythius/wum2huvu/4/

于 2018-03-29T00:36:06.073 回答
1

是的,它会出错。我们可以使用while循环。这是代码

static int addTwoNumbers(int a, int b)
{
   int carryNum;

   while(b ! =  0)
   {
      carryNum = a & b;
      a = a ^ b;
      b = carryNum << 1;
   }
   return a;
}
于 2017-10-16T12:27:55.750 回答