Java非算术加法器
我找到了一些代码,可以使用XOR和and来添加两个数字,而不使用任何算术运算符 我理解x^y等于总和,x&y等于进位。但是我不明白为什么进位必须左移?我对左位移位的了解是,这与乘以2是一样的。为什么进位要乘以2Java非算术加法器,java,algorithm,Java,Algorithm,我找到了一些代码,可以使用XOR和and来添加两个数字,而不使用任何算术运算符 我理解x^y等于总和,x&y等于进位。但是我不明白为什么进位必须左移?我对左位移位的了解是,这与乘以2是一样的。为什么进位要乘以2 public static int add(int x, int y) { // Iterate till there is no carry while (y != 0) { // carry int carry = x &
public static int add(int x, int y) {
// Iterate till there is no carry
while (y != 0)
{
// carry
int carry = x & y;
// Sum
x = x ^ y;
y = carry << 1;
}
return x;
}
publicstaticintadd(intx,inty){
//迭代直到没有进位
而(y!=0)
{
//携带
整数进位=x&y;
//总数
x=x^y;
y=carry让我们尝试使用两个小整数x=5,其中二进制等价物为101,y=1,其中二进制等价物为001
现在,为什么我要谈论二进制,或者更具体地说,要处理位?因为XOR是一种位操作
因此,如果在x和y之间运行XOR运算,结果如下:
x=x^y=101^001=100(小数点:4)
看,只是两个数字之间的异或运算并不能得到和。(5和1的和应该是6,而不是4)我们使用进位,来得到精确的和。实际上,算法是以某种方式设计的,所以它能给出正确的答案
现在,让我们看看,在这个算法中如何使用进位,给了我们正确的答案
既然
进位=x&y=101&001=1(小数点1)
根据你的程序,y=carry,尝试使用1和3,并将其绘制在一张纸上。你会看得更清楚。基本上,如果为这两个值设置了任何位,它们将导致“冒泡”向上一位。通过执行异或并将进位向上移位,您只需实现位加法。在十进制加法中,如果您将66+55相加,您将有一个从“一”列到“十”列的进位;同样,当您添加“十”列时。