我面临的问题是:-
按位运算符的逻辑在下面的代码中如何工作?
代码:
#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)如何工作?
答案 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;
}