Algorithm 算法的澄清解
我正在研究一个如下的问题: “编写两个数字相加的函数。不应使用+或任何算术运算符。” 在基数10中,要添加两个数字,可以将添加过程分为两个步骤: 1) 无进位加法 2) 只有结转值 将两者相加。解决方案基本上就是这样做的,但会在值为1)和值为2)的情况下递归,直到没有更多的携带值为止。我不理解这一点的直觉——我们怎么知道最终的结转值将为零 以下是解决方案:Algorithm 算法的澄清解,algorithm,binary,Algorithm,Binary,我正在研究一个如下的问题: “编写两个数字相加的函数。不应使用+或任何算术运算符。” 在基数10中,要添加两个数字,可以将添加过程分为两个步骤: 1) 无进位加法 2) 只有结转值 将两者相加。解决方案基本上就是这样做的,但会在值为1)和值为2)的情况下递归,直到没有更多的携带值为止。我不理解这一点的直觉——我们怎么知道最终的结转值将为零 以下是解决方案: int Add(int x, int y) { if (y == 0) return x; else
int Add(int x, int y)
{
if (y == 0)
return x;
else
return Add( x ^ y, (x & y) << 1);
}
intadd(intx,inty)
{
如果(y==0)
返回x;
其他的
返回Add(x^y,(x&y)如果我们使用的是具有固定位数(例如32位整数)的整数表示,那么我们可以进行如下推理:
在对Add
的任何给定调用中,假设y
以n个零值位结尾。(例如,如果y
的二进制表示以1000
结尾,则n是3。)
然后x&y
以至少n个零值位结束,因为无论y
在哪里,它都会有零值位
和(x&y)观察(x&y)