因此,如果我有一個number1和另一個number2 ..這兩個整數,我的方法是通過按位運算添加兩個數字來糾正的嗎?對於任何測試用例,這可能會出錯嗎?按位操作添加兩個數字?
public int add(int number1, int number2)
{
int carry = (number1&number2)<<1;
int sum = number1^number2^carry;
return sum;
}
因此,如果我有一個number1和另一個number2 ..這兩個整數,我的方法是通過按位運算添加兩個數字來糾正的嗎?對於任何測試用例,這可能會出錯嗎?按位操作添加兩個數字?
public int add(int number1, int number2)
{
int carry = (number1&number2)<<1;
int sum = number1^number2^carry;
return sum;
}
是的。這種方法不適用於涉及多次攜帶的添加。最簡單的情況是3 + 1
;作爲結果,你的函數給出0
。
沒有簡單的通用案例解決方案來解決這個問題 - 任何解決方案都必須考慮整數的寬度。有些方法見Wikipedia's article on gate-level implementations of addition。
下面是一個電路設計會增加兩個數字。爲了平移,頂部具有雙彎曲左邊緣的兩個符號是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;
}
是的,它會出錯。我們可以使用while
循環。這裏是代碼
static int addTwoNumbers(int a, int b)
{
int carryNum;
while(b ! = 0)
{
carryNum = a & b;
a = a^b;
b = carryNum << 1;
}
return a;
}
如果你插入一些不重要的數字,你會發現它是錯誤的。加法器需要依次鏈接。 (提示:你需要一個循環) – Mysticial
你能舉出這兩個數字的例子嗎? – Phoenix
到目前爲止在答案中給出了'3 + 1'。任何與鏈接進行也將是錯誤的,'63 + 1','127 + 1'等... – Mysticial