2012-09-04 59 views
2

因此,如果我有一个number1和另一个number2 ..这两个整数,我的方法是通过按位运算添加两个数字来纠正的吗?对于任何测试用例,这可能会出错吗?按位操作添加两个数字?

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

如果你插入一些不重要的数字,你会发现它是错误的。加法器需要依次链接。 (提示:你需要一个循环) – Mysticial

+0

你能举出这两个数字的例子吗? – Phoenix

+2

到目前为止在答案中给出了'3 + 1'。任何与链接进行也将是错误的,'63 + 1','127 + 1'等... – Mysticial

回答

9

Full Adder

下面是一个电路设计会增加两个数字。为了平移,顶部具有双弯曲左边缘的两个符号是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; 
} 
+0

无法正常工作。我检查了它3和9并得到12。 此外,它不适用于负面+积极。 – cookya

+3

适用于正值和负值,测试值超过500 – SVashisth

0

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

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

    while(b ! =  0) 
    { 
     carryNum = a & b; 
     a = a^b; 
     b = carryNum << 1; 
    } 
    return a; 
}