【发布时间】:2018-04-21 03:21:14
【问题描述】:
这是家庭作业,我正在努力解决这个问题,而且我能看到的至少有一半的班级都在这里。无论如何。我需要创建一个returns 1 if x <= y else return 0 的函数。
我们只能使用:! ~ & ^ | + << >>,最大操作数是:24
所有整数都必须是signed,并且不能对我创建的或 C 提供的任何其他函数进行任何调用。我们可以假设所有整数都是32 bits,并且它们必须有符号。
我不确定从哪里开始使用此功能。到目前为止,我有以下内容:
int isLessOrEqual(int x, int y) {
int diff = (y+~x+1); //The same as y-x
int diffSign = (diff>>31) & 1; //if negative, this will be 1. Else it'll be 0.
return !diffSign;
}
这似乎可行。但它不适用于某些输入(根据进行评分的程序)。
这是我在网上找到的一个功能,但我不想复制它。我想了解它,看看为什么它有效而我的无效。看来我的代码溢出时不起作用,需要处理一下。
int isLessOrEqual(int x, int y) {
int sign, isLess, dif, equal, isLessorEqual;
sign = x ^ y;
isLess = ~sign;
dif = y + (~x + 1);
equal = !dif;
sign = sign & x;
dif = ~dif;
isLess = isLess & dif;
isLess = isLess | sign;
isLess = isLess & (1 << 31);
isLessorEqual = (!!isLess) | (equal);
return isLessorEqual;
}
如果有人可以帮助我理解这些功能的不同之处或如何处理溢出,那将不胜感激,这也是我所要求的。我很接近,只是无法弄清楚这个溢出的东西
【问题讨论】:
-
您需要使用
int? -
@AnttiHaapala 是的。必须是有符号的 int。无法调用 C 中的任何其他函数或我创建的函数。
-
那么这是非常误导,因为许多未定义和实现定义的行为。最重要的是,您假设
int在diff >> 31中的宽度。 -
@Brystephor 是的,但是 C
int数学并不总是安全的,所以这就是 为什么 分配错误的原因。例如(y+~x+1)可能导致有符号溢出(如果例如y是INT_MIN和x是INT_MAX)。如果发生未定义的行为,优化编译器可能会注意到某些条件可能 - 因此优化它们... -
为什么你说它不适用于
y=5和x=-6?看起来确实如此:ideone.com/7ZhVFV
标签: c bit-manipulation