【问题标题】:Adding two numbers without using the addition operator不使用加法运算符将两个数字相加
【发布时间】:2014-03-29 18:45:19
【问题描述】:

在c中~是1的补码运算符。这相当于:~a = -b + 1 所以,a - ~b -1 = a-(-b + 1) + 1 = a + b – 1 + 1 = a + b

谁能给我解释一下?

【问题讨论】:

  • 你有没有为自己做过一些简单的例子?也许尝试以这种方式“添加”几个 4 位数字,重复 3 或 4 次,然后向自己解释一下?
  • 使用 a - -b 是另一种方式。
  • 这只有在你理解two's complement numbers之后才有意义。
  • 该推导所采取的步骤有点奇怪。 a - ~b -1 = a-(-b + 1) + 1 是有效的(并且等于 a + b),但它作为一个步骤并没有真正的意义。它看起来有点像是在替换~b = -b + 1(这是不正确的)并且通过将最后的减法更改为加法来意外修复它。很奇怪。

标签: c bitwise-operators integer-arithmetic


【解决方案1】:

从小学数学我们知道

a = -(-a);

从二进制补码我们知道

-a = (~a) + 1  (invert and add one)

所以我们知道

a + b 
= a - (-b)      elementary math
= a - (~b + 1)  twos complement
= a - (~b) - 1   distribute the negative (elementary math)

【讨论】:

    【解决方案2】:

    你说得对,~ 在 c 中总是 1 的补码(也就是按位不是)。你出错的地方是:C 不保证数字的 2 补码。所以你所有的计算都依赖于使用 C 的主要风格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      • 2010-11-12
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 2011-05-26
      相关资源
      最近更新 更多