在没有选择或“if”语句的情况下确定哪个更大和更小

时间:2012-09-16 19:54:41

标签: c

我是一名非常新的程序员。这是用C.   我必须创建一个程序,它接受两个输入整数和正方形较小的一个,并将较大的一个加倍,如果两个输入是相同的,则保持整数相同。   我不能使用关系运算符(<,>,< =,> =,或==)或if语句。我该如何开始呢?我知道我将不得不使用模数,但我没有看到如何。  任何建议将不胜感激!

4 个答案:

答案 0 :(得分:2)

这是让你走上正轨的间接答案:

x = y
X % y == 0
5 % 5 == 0

x < y
x % y == x
3 % 7 == 3
3 % 3 == 0

答案 1 :(得分:0)

请看看这个网站: http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax

它显示了如何比较没有分支的两个整数。

答案 2 :(得分:0)

扰流:

#include <stdio.h>

void no_if(int *p, int *q)
{
int *small, *large;
int diff = *p != *q;

small = *p < *q ? p : q;
large = *p > *q ? p : q;

*large += (diff) ? *large : 0;
*small *= (diff) ? *small : 1;

}

int main(void)
{
int i,j;
for (i=0; i < 3; i++) {
        for (j=0; j < 3; j++) {
                int ix=i;
                int jx=j;
                no_if ( &ix, &jx);
                printf("%d %d -> %d %d\n", i, j, ix, jx );
                }
        }
return 0;
}

更新:这使用比较/关系运算符。

答案 3 :(得分:-1)

您可以使用三元运算符

  result_a=(!((a-b)&0x8000000))?2*a:((a<b)?a*a:a);
  result_b=(b>a)?2*b:((b<a)?b*b:b);

更新:  或使用整数的最高位:

  result_a=((b-a)&0x80000000)*2*a+((a-b)&0x80000000)*a*a*(!!(a-b))+ (!(a-b))*a;      
  result_a=((a-b)&0x80000000)*2*ab+((b-a)&0x80000000)*b*b*(!!(a-b))+ (!(a-b))*b;