【问题标题】:How to add two numbers without using + operator in C using bit manipulation如何在不使用 + 运算符的情况下使用位操作在 C 中添加两个数字
【发布时间】:2014-07-02 09:44:35
【问题描述】:

我最近遇到了这个面试问题,我不擅长位操作。你们能解释一下函数'f'的作用吗?我不确定这个递归函数是做什么的。

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

我尝试将代码粘贴到 Visual Studio 中以测试逻辑,但编译器抛出一些错误消息“无法将类型 'uint' 隐式转换为 'bool'。返回中的条件语句 (a ?) 是否缺少某些内容?但我确定面试问题和上面提到的完全一样

【问题讨论】:

  • 这是一个非常糟糕的面试问题。
  • 这是没有+geeksforgeeks.org/…的总和
  • 这是一个很好的面试问题:对于大多数程序员来说,这不是一个技能测试,而是他们过去是否见过这个技巧。远离那些筛选“愚蠢的程序员技巧”的雇主。
  • @WayneConrad:从这个意义上说,是的,这太棒了;)
  • 除了尝试一堆输入并注意到结果以总和结尾并只是说经过这么多测试后它会这样做之外,还有什么办法可以解决这个问题?

标签: c recursion bit-manipulation bit


【解决方案1】:

cmets 中已经有几个人提到这一点只是增加了两个数字。我不确定是否有比尝试一些输入并记录结果更好的方法来解决这个问题。

例如:

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 返回两个输入相加。

【讨论】:

    【解决方案2】:

    准雇主要么非常彻底,要么受到残酷和不寻常的惩罚。

    对于这个问题的答案,来自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 &amp; y) &lt;&lt; 1 代替 2 * (x &amp; y) 并使用递归来计算求和和 or ab,直到 a = 0 返回 b .

    很高兴这不是我的采访。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 2013-10-01
      • 1970-01-01
      相关资源
      最近更新 更多