【问题标题】:Java Non Arithmetical Adder [duplicate]Java非算术加法器[重复]
【发布时间】:2014-10-10 03:56:52
【问题描述】:

我找到了一些代码,可以使用 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 & y;  

        // Sum 
        x = x ^ y; 


        y = carry << 1;
    }
    return x;

}

任何指导表示赞赏。

【问题讨论】:

  • 尝试使用 1 和 3 并将其绘制在一张纸上。你会看得更清楚。基本上,如果为这两个值设置了任何位,它们将导致“冒泡”一位。通过进行异或并向上移动进位,您只需实现按位加法。
  • 在十进制加法中,如果你加上 66 + 55,你会有一个进位从个列移到十列;同样,当您添加十列时。

标签: java algorithm


【解决方案1】:

让我们尝试使用两个小整数 x=5,其二进制等效值为 101 和 y=1,其二进制等效值为 001。

现在,为什么我要讨论二进制或更具体地说,要处理位?因为 XOR 是一种明智的操作。

所以,如果你在 x 和 y 之间进行异或运算,结果如下:

x = x^y = 101 ^ 001 = 100(十进制:4)

看,只是两个数字之间的 XOR 运算不会给我们总和。 (5 和 1 的总和应该是 6,而不是 4)我们使用进位来获得准确的总和。实际上,该算法的设计方式是为了给我们正确的答案。

现在,让我们看看,如何在这个算法中使用进位,给我们正确的答案。

因为,

进位 = x & y = 101 & 001 = 1(十进制 1)

根据你的程序,y = 进位

因此,y 现在将变为 = 001

循环将继续运行,直到 y 变为零。

如果你再次运行循环(因为 y=2 而不是零)

x = x ^ y = 100 ^ 010 = 110(十进制:6)

进位 = x & y= 100 & 010 = 0(十进制 0)

现在,x 和 y 的新值之间的异或是 6,正好是 5 和 1 的和。看看进位,它的值现在是 0。

我们的 y 现在也将变为 0,因为右移 0 也会给我们 0。由于 y 现在为零,循环将不再运行,我们通过返回 x 得到总和!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-30
    • 2017-03-04
    • 2023-01-10
    • 2014-02-15
    • 2014-10-08
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多