我最近遇到了这个采访问题,我不善于操控。你能解释一下'f'的功能吗?我不确定这个递归函数是做什么的。
unsigned int f (unsigned int a , unsigned int b)
{
return a ? f ( (a&b) << 1, a ^b) : b;
}
我试图在Visual Studio中粘贴代码来测试逻辑但是编译器抛出了一些错误消息“无法将类型'uint'隐式转换为'bool'。条件语句(a?)在返回时丢失了什么?但我确信面试问题与上面提到的完全相同
答案 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
a
和b
直到a
<0
= b
,此时返回{{1}}。
很高兴这不是我的采访。