减去两个数字而不使用算术运算符

时间:2019-05-27 07:14:44

标签: c bitwise-operators subtraction

我面临的问题是:-

按位运算符的逻辑在下面的代码中如何工作?

代码:

#include <stdio.h>

int subtract(int x, int y)
{
    while (y != 0)
    {
        int borrow = (~x) & y;
        x = x ^ y;
        y = borrow << 1;
    }
    return x;
}

int main()
{
    int x = 29, y = 13;
    printf("\nx - y is %d", subtract(x, y));
    return 0;
}

函数减去(x,y)如何工作?

2 个答案:

答案 0 :(得分:1)

以二进制形式,

 x   y  | x-y
--- ---   ---
 0   0  |  0
 0   1  |  1 (with a borrow)
 1   0  |  1
 1   1  |  0

这就是说

 x   y  |       x-y
--- ---   ---------------
 0   0  |  0 - ( 0 << 1 )
 0   1  |  1 - ( 1 << 1 )
 1   0  |  1 - ( 0 << 1 )   
 1   1  |  0 - ( 0 << 1 )

那是

x - y

等同于

( x ^ y ) - ( ( (~x) & y ) << 1 )

因为减法的结果可以由x ^ y

给出
 x   y  | x^y
--- ---   ---
 0   0  |  0
 0   1  |  1
 1   0  |  1
 1   1  |  0

借入的金额可以由(~x) & y

给出
 x   y  | (~x) & y
--- ---   --------
 0   0  |     0
 0   1  |     1
 1   0  |     0
 1   1  |     0

检查(正数和负数)溢出发生的情况留给用户。

答案 1 :(得分:0)

使用递归函数

int reduce(int a, int b){
    if(b == 0){
        return a;
    }
    int value, carry;
    carry = ((~a) & b) << 1;
    value = a ^ b;
    return reduce(value,carry);
}

使用while循环

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