如何使用位操作在C中不使用+运算符添加两个数字

时间:2013-11-01 20:52:48

标签: c recursion bit-manipulation bit

我最近遇到了这个采访问题,我不善于操控。你能解释一下'f'的功能吗?我不确定这个递归函数是做什么的。

unsigned int f (unsigned int a , unsigned int b)
{
   return a ?   f ( (a&b) << 1, a ^b) : b;
}

我试图在Visual Studio中粘贴代码来测试逻辑但是编译器抛出了一些错误消息“无法将类型'uint'隐式转换为'bool'。条件语句(a?)在返回时丢失了什么?但我确信面试问题与上面提到的完全相同

2 个答案:

答案 0 :(得分:4)

在提到这一点的评论中已经有一些人只添加了两个数字。我不确定一个更好的方法来解决这个问题,而不仅仅是尝试一些输入并注意结果。

例如:

f(5,1) --> returns f(2,4) --> returns f(0,6) --> returns 6

 1.) 5&1 = 1 bit shifted = 2:  5^1 = 4
 2.) 2&4 = 0 bit shifted = 0:  2^4 = 6
 3.) a = 0 so return b of 6

f(4,3) --> returns f(0,7) --> returns 7

1.) 4&3 = 0 bit shifted = 0:  4^3 = 7
2.) a = 0 so return b of 7

在您展示输出的一些示例之后,我想您可以假设f返回两个输入相加的输入。

答案 1 :(得分:0)

未来的雇主要么非常彻底,要么享受残忍和充实;不寻常的惩罚。

对于这个问题的答案,对HackersDelight中免费提供的第2章的审查值得用黄金来衡量。函数中的加法运算符取自HAKMEM memo -- Item 23,并用左移代替乘以2.原始的HAKMEM备忘录建议:

(A AND B) + (A OR B) = A + B = (A XOR B) + 2 (A AND B)

或用C:

重写
x + y = (x ^ y) + 2 * (x & y)

然后,广告素材雇主使用(x & y) << 1代替2 * (x & y)并使用递归来计算总和以及or ab直到a <0 = b,此时返回{{1}}。

很高兴这不是我的采访。