0

给定两个整数,如何在不使用 if 语句或选择(>=、> 和 =)的情况下区分这两个整数、最大值、最小值和相等性。我考虑过使用fminand fmax,但我还需要知道如何知道这两个整数是否相同。

4

4 回答 4

4

假设 2 的补码算法:

int intcmp(int int1, int int2)
{
    int diff=int2-int1;
    unsigned int udiff;
    memcpy(&udiff, &diff, sizeof(diff));
    if(!udiff)
        return 0;  /* the two integers are equal */
    else if(udiff & 1<<(sizeof(udiff)*CHAR_BIT-1))  /* check the sign */
        return +1;  /* int1 < int2 */
    else
        return -1;  /* int2 < int1 */
}
于 2012-09-15T22:56:01.183 回答
1

怎么样...

(num1-num2) ? ((num1-num2) & (MAX_INT+1) ? NEGATIVE : POSITIVE) : EQUAL
于 2012-09-15T22:55:51.527 回答
0

你所说的“区分”是什么意思?如果没有某种分支操作,你不能让两个数字选择两个不同的执行路径,但理论上你可以用函数指针加载一个数组并操纵数字来选择不同的数组元素来调用(调用是一种形式分支)。

您可以更轻松地加载具有两个不同字符串指针的数组,并根据您获得的数字选择要打印的数组。

您可以通过与 1 进行与运算,根据它是奇数还是偶数将数字转换为 0 或 1,例如。您可以通过减去它们并查看是否为零来确定数字是否相等。等等。

于 2012-09-15T22:51:11.233 回答
0

您可以使用以下内容生成蒙版

signed int x = ...;
signed int y = ...;
mask = (x - y) >> 31;

如果 y>x 也是如此,mask否则(但要小心溢出)。然后,您可以使用、和使用此掩码构建您的结果。-10&|~

于 2012-09-15T22:53:25.757 回答