因此,如果我有一个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