Как этот код работает, чтобы найти наибольшее из трех чисел без использования какого-либо оператора сравнения?

вот функция, которая находит большее из двух чисел:

int larger(int a,int b)
{
    int c=a-b;
    int k=c>>31&1;
    int max=a-k*c;
    return max;
 }

чтобы найти наибольшее из трех чисел, назовите его так:

larger(a,larger(b,c));

Как это работает?

3 ответов


int c=a-b;

cбудет отрицательный, если a < b иначе это будет положительно. Теперь отрицательное число будет иметь свой самый значительный бит(MSB).

int k=c>>31&1;

этот шаг предполагает, что sizeof(int) is 4 байты и извлекает MSB c на k. Так что k либо 0 или 1

int max=a-k*c;

замена c = a-b в этом мы вам max = a-k*(a-b). Так когда

k = 0, max = a-0*(a-b)
           = a

k = 1, max = a-1*(a-b)
           = b

это работает только для 32-разрядных целых чисел, конечно.

k=c>>31&1 изолирует бит знака, который равен 0 или 1.

если k 0, тогда a>=b и max = a - 0*(a-b) = a.

если k 1, то a<b и max = a - 1*(a-b) = a-a+b = b.

исторически, конвейеризация инструкций была основной причиной использования кода, который позволяет избежать


попробуйте это.. он длинный, извините: P

while(x && y && z)
{
        x--;y--;z--;c++;
}


if(x && y)
{
while(x && y)
{
    x--;y--;c++;
}
if(x) c+=x;
if(y) c+=y;
}


if(z && y)
{   
while(z && y)
{
    z--;y--;c++;
}
if(z) c+=z;
if(y) c+=y;
}

if(x && z)
{
while(x && z)
{
    x--;z--;c++;
}
if(x) c+=x;
if(z) c+=z;
}

return c;