不使用' - '运算符减去两个数字

pra*_*nay 7 c bit-manipulation

我尝试使用以下代码,但我无法理解为什么它给了我错误的答案.我正在计算2的补码并加上另一个补.

#include <stdio.h>

int add(int a, int b) {
    while (a) {
        a = (a & b) << 1;
        b = a^b;
    }
    return b;
}

int sub(int a, int b) // add a with b's 2's complement.
{
    return (add(a, add(~b, 1)));
}

int main() {
    int a, b, res;
    a = 3, b = 1;
    res = sub(a, b);
    printf("%d\n", res);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

pra*_*nay 6

我使用了NullUserException建议的不同的add()函数,它现在可以工作:

int add(int a,int b)
{
  int x;
  x = a^b;

  while(a&b)
  {
    b = ((a&b)<<1);
    a = x;
    x = a^b;
    //b=(a^b);
  }

  return x;
}
Run Code Online (Sandbox Code Playgroud)

  • C中的@ChiragTayal几乎可以是布尔值. (6认同)