我需要使用按位运算在C中创建一个方法,该方法检查x + y是否会溢出。我最多只能使用以下20个操作; ! 〜& ^ | +<< >>请记住,我必须测试负数和正数。
我已多次尝试使其正常工作。我的逻辑是否合理?我要走了: 如果(x + y)小于x,则它已溢出。基于这个逻辑,我写了这个;
int addOK(int x, int y)
{
int sum = x + y;
int nx = ((~x) + 1);
int check = (sum + nx)>>31;
return !check;
}
谢谢!
答案 0 :(得分:0)
这应该可行,但它不仅使用按位运算符,但它适用于signed:
int addOK(int x, int y)
{
int check;
if (greaterThan(0, x^y))
check = 0;
else if (greaterThan(x, 0))
check = greaterThan(y, INT_MAX -x);
else
check = greaterThan(INT_MIN -x, y);
return check;
}
int greaterThan(int first, int second) {
/* first > second means second - first is less than 0
shift the sign bit and then compare it to 1 */
return (second + (~first +1)) >> ((sizeof(int) * 8) -1) & 1;
}
如果这两个数字都是正数应该足够了:
int addOK(int x, int y) {
if(x^y < 0)
return 0;
return 1;
}