2012-09-04 94 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; 
}