Как этот код работает, чтобы найти наибольшее из трех чисел без использования какого-либо оператора сравнения?
вот функция, которая находит большее из двух чисел:
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;