因此,如果我有一个数字1和另一个数字2 ..两个整数,我的方法是使用按位运算添加两个数字?任何测试用例都会出错吗?
public int add(int number1, int number2)
{
int carry = (number1&number2)<<1;
int sum = number1^number2^carry;
return sum;
}
答案 0 :(得分:10)
以下是电路设计人员如何添加两个数字。为了平移,顶部的两个符号具有双曲面左边缘是XOR(^),中间的两个具有平坦的左边缘的是AND(&amp;),并且具有单个弯曲的左边缘的最后一个是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;
}
答案 1 :(得分:6)
是。这种方法不适用于涉及多个载体的添加。最简单的这种情况是3 + 1
;你的函数给出0
作为结果。
没有简单的通用解决方案来解决这个问题 - 任何解决方案都必须考虑整数的宽度。有些方法,请参阅Wikipedia's article on gate-level implementations of addition。
答案 2 :(得分: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;
}
答案 3 :(得分:0)
这是在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;
}